powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / правильный подход к многопоточному разделения задания
15 сообщений из 15, страница 1 из 1
правильный подход к многопоточному разделения задания
    #38400111
roibush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Подскажите плиз как правильно организовать многопоточное разделение таска.
Например есть файл который надо распарсить, я разбиваю его на 10 частей и 10 потоками надо паралельно его парсить
и потом дождавшись отработки все потоков общий рез-т послать jms месаджем.
TIJ не сильно помогла, не понятно как это правильно организовавать через Executors (Callable и т.д.) или Synchronizers (CountDownLatch и тд) ? То есть что лучше юзать для окончания работы всех потоков?

Заранее спасибо!
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38400181
pasha701
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38400240
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ForkJoinPool - ровно то, что вам нужно.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38401628
roibush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pasha701 , cdtyjv , огоромное спасибо!
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38403101
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvForkJoinPool - ровно то, что вам нужно.

FJP не предназначен для выполнения тасков в которых есть IO или блокировки. Тем более когда количество подзадач настолько мало.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38403104
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerFJP не предназначен для выполнения тасков в которых есть IO или блокировки.
Почему?
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38403164
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПочему?Вот мне тоже очень интересно. Предполагаю, что сейчас нам скажут про NIO.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38403182
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvВот мне тоже очень интересно. Предполагаю, что сейчас нам скажут про NIO.
Я даже явадок открыл из любопытства. Да там есть про блокирующее IO. Но там ничего нет про "не преднозначен". Просто немного иначе используется.
Можно и через Executors конечно, просто дождаться окончания всех задач. Разницы особой нет.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38404906
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczfixxerFJP не предназначен для выполнения тасков в которых есть IO или блокировки.
Почему?

Вкратце, FJP сам управляет жизненным циклом тредов. Если поток долго не появляется в поле зрения пула, то он пытается это компенсировать созданием дополнительных потоков, что теоретически чревато, например, OOM при долгих блокирующих операциях.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38404915
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczfixxerFJP не предназначен для выполнения тасков в которых есть IO или блокировки.
Почему?

Про это говорил Шипилев на последней JUG в Москве. Не знаю, говорил ли в Питерской версии, но на всякий случай вот ссылка
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38404951
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerПро это говорил Шипилев на последней JUG в Москве. Не знаю, говорил ли в Питерской версии, но на всякий случай вот ссылка Да ничего подобного он не говорил. Идея очень простая: FJP хорошо разруливает ситуации, когда одному потоку надо дождаться окончания выполнения другого. В этом случае FJP может загрузить его полезной работой. Но такое на работает для других блокирующих операций (синхронайзеры, IO). И когда внутри таска вы сталкиваемся с блокирующими операциями, то FJP не может загрузить такие потоки полезной работой, они тупо простаивают так же, как и в обычных пулах.
Чтобы это дело обойти были придуманы managed blockers ( http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html#managedBlock(java.util.concurrent.ForkJoinPool.ManagedBlocker)). Когда FJP натыкается на такого блокера, в который завернута реальная блокирующая операция, то текущий тред блокируется, а FJP пытается компенсировать потерянный поток путем создания нового. И вот в этом случае у нас действительно есть опасность порушить все, например тем же OOME.

Поэтому никаких проблем с обычным IO нет, можно спокойно его использовать в FJP, и не париться. А вот если хочется повысить эффективность работы FJP с блокирующими операциями, и вы решаете полезть в managed blockers, тогда да - надо быть осторожным.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38404957
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczcdtyjvВот мне тоже очень интересно. Предполагаю, что сейчас нам скажут про NIO.
Я даже явадок открыл из любопытства. Да там есть про блокирующее IO. Но там ничего нет про "не преднозначен". Просто немного иначе используется.
Можно и через Executors конечно, просто дождаться окончания всех задач. Разницы особой нет.

ForkJoinTask , третий абзац

Computations should avoid synchronized methods or blocks, and should minimize other blocking synchronization apart from joining other tasks or using synchronizers such as Phasers that are advertised to cooperate with fork/join scheduling. Tasks should also not perform blocking IO, and should ideally access variables that are completely independent of those accessed by other running tasks. Minor breaches of these restrictions, for example using shared output streams, may be tolerable in practice, but frequent use may result in poor performance, and the potential to indefinitely stall if the number of threads not waiting for IO or other external synchronization becomes exhausted.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38404989
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvfixxerПро это говорил Шипилев на последней JUG в Москве. Не знаю, говорил ли в Питерской версии, но на всякий случай вот ссылка Да ничего подобного он не говорил. Идея очень простая: FJP хорошо разруливает ситуации, когда одному потоку надо дождаться окончания выполнения другого. В этом случае FJP может загрузить его полезной работой. Но такое на работает для других блокирующих операций (синхронайзеры, IO). И когда внутри таска вы сталкиваемся с блокирующими операциями, то FJP не может загрузить такие потоки полезной работой, они тупо простаивают так же, как и в обычных пулах.
Чтобы это дело обойти были придуманы managed blockers ( http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html#managedBlock(java.util.concurrent.ForkJoinPool.ManagedBlocker)). Когда FJP натыкается на такого блокера, в который завернута реальная блокирующая операция, то текущий тред блокируется, а FJP пытается компенсировать потерянный поток путем создания нового. И вот в этом случае у нас действительно есть опасность порушить все, например тем же OOME.

Поэтому никаких проблем с обычным IO нет, можно спокойно его использовать в FJP, и не париться. А вот если хочется повысить эффективность работы FJP с блокирующими операциями, и вы решаете полезть в managed blockers, тогда да - надо быть осторожным.

Да, ты прав .
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38404995
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxercdtyjvпропущено...
Да ничего подобного он не говорил. Идея очень простая: FJP хорошо разруливает ситуации, когда одному потоку надо дождаться окончания выполнения другого. В этом случае FJP может загрузить его полезной работой. Но такое на работает для других блокирующих операций (синхронайзеры, IO). И когда внутри таска вы сталкиваемся с блокирующими операциями, то FJP не может загрузить такие потоки полезной работой, они тупо простаивают так же, как и в обычных пулах.
Чтобы это дело обойти были придуманы managed blockers ( http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html#managedBlock(java.util.concurrent.ForkJoinPool.ManagedBlocker)). Когда FJP натыкается на такого блокера, в который завернута реальная блокирующая операция, то текущий тред блокируется, а FJP пытается компенсировать потерянный поток путем создания нового. И вот в этом случае у нас действительно есть опасность порушить все, например тем же OOME.

Поэтому никаких проблем с обычным IO нет, можно спокойно его использовать в FJP, и не париться. А вот если хочется повысить эффективность работы FJP с блокирующими операциями, и вы решаете полезть в managed blockers, тогда да - надо быть осторожным.

Да, ты прав .

Что, тем не менее, не отменяет того, что к блокирующему IO в FPJ следует отнестись с вниманием.
...
Рейтинг: 0 / 0
правильный подход к многопоточному разделения задания
    #38405023
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxer ,
Ну я бы еще больше обобщил: в любых пулах надо с опаской работать с блокирующими операциями. Так как это и сжигание тактов, и риск starvation, и риск OOME. Причем риск всей этой фигни выше, если мы из одного таска плодим другие таски ... а именно так и работает FJP.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / правильный подход к многопоточному разделения задания
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]