Выбор ответа Senior java.util.concurrent и виртуальные потоки обновлено
Work stealing в ForkJoinPool
Вопрос
Чем ForkJoinPool отличается от обычного ThreadPoolExecutor?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: У потоков свои деки, а свободные крадут задачи у чужих (work stealing). ForkJoinPool рассчитан на рекурсивное деление задач: поток кладёт подзадачи в свой дек и берёт их с головы, а простаивающие потоки крадут с хвоста у других.
Варианты ответа
- Он создаёт новый поток на каждую подзадачу, вызванную через
fork() - Он выполняет задачи строго в порядке поступления из одной общей очереди
- Он предназначен для блокирующего ввода-вывода и держит запас потоков
- У потоков свои деки, а свободные крадут задачи у чужих (work stealing)правильный ответ
Разбор
ForkJoinPool рассчитан на рекурсивное деление задач: поток кладёт подзадачи в свой дек и берёт их с головы, а простаивающие потоки крадут с хвоста у других. Это снижает конкуренцию за общую очередь. Потоков столько, сколько задано параллелизмом, а не по одному на fork. Порядок не FIFO. Для блокирующего I/O он плох (кроме ManagedBlocker и виртуальных потоков, которые сами на нём построены).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- null в ConcurrentHashMap
- CompletableFuture без executor
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier