Я хотел бы понять порядок, в котором задачи обрабатываются в пуле Java fork-join.
Пока что единственная соответствующая информация, которую я нашел в документации, касается параметра, называемого "asyncMode".", что является" истиной, если этот пул использует локальный режим планирования "первым пришел - первым вышел" для разветвленных задач, которые никогда не объединяются ".
Моя интерпретация этого утверждения заключается в том, что у каждого работника есть собственная очередь задач;работники берут задания с начала своей очереди или крадут за очереди других работников, если их собственные очереди пусты;работники добавляют вновь разветвленные задачи в конец (соответственно фронт) своих собственных очередей, если asyncMode имеет значение true (соответственно, false).
Пожалуйста, исправьте меня, если моя интерпретация неверна!
Сейчасэто вызывает пару вопросов:
1) Каков порядок для разветвленных задач, к которым присоединено ?
Мне кажется, чтокогда задача разветвляется, она добавляется в очередь работника, как описано в моей интерпретации выше.Теперь предположим, что задача присоединена ...
Если при вызове объединения задача еще не запущена, рабочий, вызывающий соединение, вытянет задачу из очереди инемедленно приступить к работе над ним.
Если при вызове соединения задача уже была украдена другим работником, то рабочий, вызывающий соединение, будет работать над другими задачами в то же времяпорядок получения заданий, описанных в моей интерпретации выше), пока задача, к которой оно присоединяется, не была завершена работником, который его украл.
Это предположение основано на написании простого тестового кодас помощью операторов печати и наблюдения за тем, как изменение порядка вызовов соединения влияет на порядок обработки задач.Может ли кто-нибудь сказать мне, если мои предположения верны?
2) Каков порядок для задач, которые отправляются извне?
Согласно ответ нана этот вопрос пулы с объединением вил не используют внешние очереди.(Я использую Java 8, между прочим.)
Итак, я понимаю, что, когда задача отправляется извне, задача добавляется в случайно выбранную рабочую очередь?
Если да, добавляется ли отправленная извне задача в конец или в начало очереди?
Наконец, зависит ли это от того, передана ли задача путем вызова pool.execute (task) или по вызову pool.invoke (задача)?И зависит ли это от того, является ли поток, вызывающий pool.execute (задача) или pool.invoke (задача), внешним потоком или потоком в этом пуле разветвления?