Выбор ответа Senior java.util.concurrent и виртуальные потоки обновлено

Work stealing в ForkJoinPool

Вопрос

Чем ForkJoinPool отличается от обычного ThreadPoolExecutor?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: У потоков свои деки, а свободные крадут задачи у чужих (work stealing). ForkJoinPool рассчитан на рекурсивное деление задач: поток кладёт подзадачи в свой дек и берёт их с головы, а простаивающие потоки крадут с хвоста у других.

Варианты ответа

  1. Он создаёт новый поток на каждую подзадачу, вызванную через fork()
  2. Он выполняет задачи строго в порядке поступления из одной общей очереди
  3. Он предназначен для блокирующего ввода-вывода и держит запас потоков
  4. У потоков свои деки, а свободные крадут задачи у чужих (work stealing)правильный ответ

Разбор

ForkJoinPool рассчитан на рекурсивное деление задач: поток кладёт подзадачи в свой дек и берёт их с головы, а простаивающие потоки крадут с хвоста у других. Это снижает конкуренцию за общую очередь. Потоков столько, сколько задано параллелизмом, а не по одному на fork. Порядок не FIFO. Для блокирующего I/O он плох (кроме ManagedBlocker и виртуальных потоков, которые сами на нём построены).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме