Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / правильный подход к многопоточному разделения задания / 15 сообщений из 15, страница 1 из 1
18.09.2013, 13:32:31
    #38400111
roibush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный подход к многопоточному разделения задания
Всем привет!

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

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

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

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

Про это говорил Шипилев на последней JUG в Москве. Не знаю, говорил ли в Питерской версии, но на всякий случай вот ссылка
...
Рейтинг: 0 / 0
23.09.2013, 16:55:19
    #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
23.09.2013, 16:57:59
    #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
23.09.2013, 17:20:53
    #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
23.09.2013, 17:23:33
    #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
23.09.2013, 17:45:17
    #38405023
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный подход к многопоточному разделения задания
fixxer ,
Ну я бы еще больше обобщил: в любых пулах надо с опаской работать с блокирующими операциями. Так как это и сжигание тактов, и риск starvation, и риск OOME. Причем риск всей этой фигни выше, если мы из одного таска плодим другие таски ... а именно так и работает FJP.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / правильный подход к многопоточному разделения задания / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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