Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 1
Регистрация: 05.04.2013
Сообщений: 225

Многопоточность

29.03.2014, 17:59. Показов 3193. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Тяжелая однако для меня тема многопоточности. Столкнулся вот с такой вот задачей, над которой уже несколько дней "бодаюсь". Помогите пожалуйста разобраться:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ExecutorService executor= Executors.newFixedThreadPool(SIZE_POOL);
        
        for (int i=0; i<favorite.length; i++)
        {   
            Task_Get.favorite=favorite[i];
            Runnable task=new Task_Get();
            //task.run(); 
            executor.execute(task);
            all_favorite.put(favorite[i], Task_Get.address);
            Task_Get.address.clear();
        }
        executor.shutdown();
        try {
            executor.awaitTermination(10, TimeUnit.SECONDS);
            printerFile(all_favorite);
            }
        catch (IOException e) {
            e.printStackTrace();
            } 
        catch (InterruptedException e) {
            System.out.println("Server is overloaded"); 
            e.printStackTrace();
        }
Собственно проблема в том, что процессы по всей видимости спорятся. Так как существует массив favorite а передаются значения как то хаотично, либо вообще выполняется один и тот же, причем то первый то второй(возможно потому что пока что массив всего из 3-х значений). Подскажите что я не так делаю или что нужно изменить, или где нужна синхронизация ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2014, 17:59
Ответы с готовыми решениями:

Многопоточность
Здравствуйте, что-то у меня не выходит ... Должно быть так А . . В А . . В А . . В ... и т.д.

Многопоточность
сделать Дизайн приложения, по крайней мере из двух нитей: - Один для обработки массива - Один для написания результатов в файл.из 2...

Многопоточность
Мне нужно что бы сообщение System.out.println(String.format(&quot;%1$s будит парикмахера.&quot;, client.getName())); выводилось только один раз. В...

24
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
02.04.2014, 19:02
Студворк — интернет-сервис помощи студентам
IGROK@,
касательно общего дизайна. Для задач которые выдают результат, лучше использовать Callable<T> вместо Runnable, тогда соотв. Future будет возращать результат.
И не нужно будет извращаться с передачей результатов через стат. структуры.
И не нужен будет отдельный шаг ожидания.
примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Task_Get implements Callable<String>{
   Task_Get(String fav, String text){
      ...
   }
 
   public String call(){
     ....
   }
}
 
List<Future<String>> futures = new ArrayList<Future<String>>();
for (int i=0; i<favorite.length; i++) {   
   futures.add(executor.submit(new Task_Get(favorite[i], text)));
}
for (int i=futures.size();i-->0;) {   
   all_favorite.put(favorite[i], futures.get(i).get());
}
Касательно потоков. Все зависит от памяти, числа процессоров, ОС.
10 000 пока считается очень много. Разумным числом считается порядка 1000.
1
1 / 1 / 1
Регистрация: 05.04.2013
Сообщений: 225
03.04.2014, 00:02  [ТС]
Цитата Сообщение от bigwhitefish Посмотреть сообщение
И не нужен будет отдельный шаг ожидания.
bigwhitefish, Т.е. Вы хотите сказать, что такой метод решения, будет работать быстрее, стабильнее и надежней ? Или это общепринятая модель ?
Цитата Сообщение от bigwhitefish Посмотреть сообщение
Все зависит от памяти, числа процессоров, ОС.
да я буду рад, если будет полностью использоваться моё железо, и получится получить результат хотя бы за 1 секунду. )) Мне нужно найти в 10 массивах содержащих в себе приблезительно по 10 - 15 тыс чаров, совпадение от 3 до 64 значений подряд. Каким образом можно это сделать быстро ? я подумывал запустить в многопоточном режиме сравнение, где каждый поток принимает 3 (или 64) значения которые нужно найти, и сверяет согласно принятому индексу до N-3 (или N-64) (рассуждение теоретическое, не знаю как оно получится и будет ли работать) И таких потоков умножить на 10. Т.е. в итоге должно получится: 10 потоков, внутри которых бежит по 10-15 тысяч ))) Для чего? Нужна скорость. Подскажите или предложите другой вариант, что бы я не наломал дров... )))

Добавлено через 1 минуту
Цитата Сообщение от bigwhitefish Посмотреть сообщение
10 000 пока считается очень много. Разумным числом считается порядка 1000.
мдя... Видимо не разумно я думал.
0
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
03.04.2014, 10:58
Цитата Сообщение от IGROK@ Посмотреть сообщение
bigwhitefish, Т.е. Вы хотите сказать, что такой метод решения, будет работать быстрее, стабильнее и надежней ? Или это общепринятая модель ?
Сравнение по "стабильнее и надежней" я не приемлю.
Решения бывают корректные и некорректные, бинарная система.
Корректные решения могут быть более или менее красивыми.
Красивые - значит более короткие, читабельные (за исключением случаев, когда применяется какой-то нетривиальный алгоритм), и быстрые. Как правило, не знаю почему, эти качества ходят вместе.

Насчет общепринятости не знаю (среди кого?), но сам предпочитаю- это использовать по максимуму проверенные АПИ, и стремиться к корректности и красоте.

Добавлено через 4 минуты
Цитата Сообщение от IGROK@ Посмотреть сообщение
да я буду рад, если будет полностью использоваться моё железо, и получится получить результат хотя бы за 1 секунду. )) Мне нужно найти в 10 массивах содержащих в себе приблезительно по 10 - 15 тыс чаров, совпадение от 3 до 64 значений подряд.
Тут работы на миллисекунду, если не меньше, для какого нибудь атома. Какие потоки, вы что?
0
1 / 1 / 1
Регистрация: 05.04.2013
Сообщений: 225
03.04.2014, 11:04  [ТС]
Цитата Сообщение от bigwhitefish Посмотреть сообщение
Красивые - значит более короткие, читабельные (за исключением случаев, когда применяется какой-то нетривиальный алгоритм), и быстрые. Как правило, не знаю почему, эти качества ходят вместе.
Спасибо, понял, буду пробовать переписать. ))

Цитата Сообщение от bigwhitefish Посмотреть сообщение
Тут работы на миллисекунду, если не меньше, для какого нибудь атома. Какие потоки, вы что?
подтолкните на мысль, каким методом можно достичь самого быстрого результата ?

Цитата Сообщение от bigwhitefish Посмотреть сообщение
Какие потоки, вы что?
ну я просто осваиваю многопоточность, по этому все мысли только в эту сторону ))
0
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
03.04.2014, 13:48
Цитата Сообщение от IGROK@ Посмотреть сообщение
подтолкните на мысль, каким методом можно достичь самого быстрого результата ?
По вашему описанию, там простейший однопроходный алгоритм. Размер данных - 150 000 - очень маленький.
Чтобы появился заметный эффект от параллельной обработки, размер данных должен быть хотя бы на 3 порядка больше.
Тогда можно делать обработку каждого массива в в отдельном потоке.

Оптимальное количество потоков в этом случае (т.е. когда узкое место - процессор) равно количеству ядер, включая виртуальные.

Если бы вы получали данные с удаленных серверов, то они и былы бы узким местом, в этом случае оптимальное число потоков - чем больше, тем лучше.

Если вы хотите развиваться, я бы порекомендовал два направления.
1. Воскурить какую-нибудь брахманскую литературу по устройству ОС, какого-нибудь Танненбаума, можно 20-25 летней давности.
2. Постоянно курить Java Memory Model в любых видах, начиная с ее объяснений для чайников. Ссылки найдете сами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2014, 13:48
Помогаю со студенческими работами здесь

Многопоточность
Добрый день, уважаемые гуру многопоточного программирование. Если Вас не затруднит, ответьте пожалуйста на несколько вопросов: 1 К...

Многопоточность
Данный код должен в теории выдавать произвольное число (в определенном интервале). У меня четко каждый раз 200 000. В чем ошибка? ...

Многопоточность
Люди, не могли бы вы на пальцах объяснить, что такое пул потоков, а то перечитал тучу статей, а все равно не совсем представляю себе что...

Многопоточность
Доброго времени. Не могу сообразить как сделать: Задача: Методы класса Main вызываются из разных потоков. Нужно получить статистику...

Многопоточность NullPointerException
Кто-нибудь может подсказать, почему при k=2 и z=1 выбрасывается ошибка NullPointerException и как побороть данную проблему? class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru