ForkJoinPool останавливается во время invokeAll / join

Я пытаюсь использоватьForkJoinPool распараллелить мои интенсивные вычисления процессора. Насколько я понимаю, ForkJoinPool заключается в том, что он продолжает работать до тех пор, пока любая задача доступна для выполнения. К сожалению, я часто наблюдал, как рабочие потоки работают в режиме ожидания / ожидания, поэтому не все процессоры заняты Иногда я даже наблюдал дополнительные рабочие темы.

Я не ожидал этого, так как я строго пытался использоватьнеблокирующая задачи. Мои наблюдения очень похожи наForkJoinPool, кажется, тратить нить, После большой отладки в ForkJoinPool у меня есть предположение:

Я использовал invokeAll () для распределения работы по списку подзадач. После того, как invokeAll () завершил выполнение первой задачи, он начинает присоединяться к другим. Это работает нормально, пока следующая задача для присоединения не окажется поверх очереди выполнения. К сожалению, я представил дополнительные задачи асинхронно, не присоединяясь к ним. Я ожидал, что среда ForkJoin сначала продолжит выполнение этой задачи, а затем вернется к присоединению к оставшимся задачам.

Но, похоже, так не работает. Вместо этого рабочий поток останавливается, вызывая wait (), пока задача, ожидающая выполнения, не будет готова (предположительно, выполняется другим рабочим потоком). Я не проверял это, но, похоже, это общий недостаток вызова join ().

ForkJoinPool предоставляетasyncMode, но это глобальный параметр, и его нельзя использовать для отдельных заявок. Но мне нравится видеть, что мои асинхронно разветвленные задачи скоро будут выполнены.

Итак, почему ForkJoinTask.doJoin () не просто выполняет любую доступную задачу поверх своей очереди, пока она не будет готова (либо выполнена сама, либо украдена другими)?

Ответы на вопрос(3)

Ваш ответ на вопрос