Ограничение потока Java ForkJoinPool или альтернатива потоку Java?

Я понимаю, что java parallelStream (или ForkJoinPool) предназначен для максимального использования ЦП. Из-за отличного сочетания функциональных интерфейсов потока Java (таких как карта, уменьшение, фильтр) и ForkJoinPool я использую параллельный поток Java и ForkJoinPool.

Проблема в том, что ForkJoin не ограничивает количество активных потоков. Если некоторые потоки заблокированы, пока они занимают большой объем памяти, ForkJoinPool пытается создать больше потоков, чтобы обеспечить параллелизм (работающий поток).

В этом случае использование процессора будет максимальным, но память кучи будет исчерпана или даже перейдет в состояние OOM.

Как я могу ограничить количество активных потоков ForkJoinPool?

Или есть альтернативы интерфейсу потока Java?

это?
Eugene 23.12.2020 03:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
427
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понимаю, что java parallelStream (или ForkJoinPool) предназначен для максимального использования ЦП.

Это не совсем цель. Это может иметь эффект максимального использования ЦП, но цель состоит в том, чтобы ускорить вычисления. Это НЕ одно и то же.

Как я могу ограничить количество активных потоков ForkJoinPool?

Согласно этой ветке списка рассылки , один из способов предотвратить взрыв пула потоков forkjoin в патологических ситуациях — предоставить пользовательский ForkJoinThreadFactory, который отслеживает количество существующих потоков (каким-то образом) и возвращает null, когда уже существует слишком много потоков.

Имейте в виду, что если вы достигнете предела (установленного вашей фабрикой), вы получите RejectedExecutionExceptions за отправку задачи.


Или есть альтернативы интерфейсу потока Java?

Я не знаю ни одного.

Но я не уверен, что вы вообще столкнетесь с этой проблемой при обычном использовании Stream.parallelStream().

Если вы столкнулись с этим и отказы в выполнении вызывают проблемы, вам, вероятно, придется поискать другой способ выражения вычислений; например используя сопрограммы, а не потоки, или с рабочими очередями и Executor, или что-то еще, о чем я не подумал :-)

Другие вопросы по теме