Выбор ответа Senior java.util.concurrent и виртуальные потоки обновлено
CompletableFuture без executor
Вопрос
В каком пуле выполнится CompletableFuture.supplyAsync(() -> httpCall()) без второго аргумента?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В ForkJoinPool.commonPool(), общем на всё приложение. Без executor Async методы используют общий ForkJoinPool (с параллелизмом около числа ядер минус один; если параллелизм пула равен 1, создаётся новый поток на каждую задачу).
Варианты ответа
- В новом платформенном потоке, отдельном для каждой задачи
- В пуле виртуальных потоков, если версия Java 21
- В
ForkJoinPool.commonPool(), общем на всё приложениеправильный ответ - В вызывающем потоке, как обычный синхронный вызов метода
Разбор
Без executor *Async методы используют общий ForkJoinPool (с параллелизмом около числа ядер минус один; если параллелизм пула равен 1, создаётся новый поток на каждую задачу). Блокирующий HTTP-вызов там занимает поток и тормозит все параллельные стримы и другие async-задачи. Виртуальные потоки в Java 21 автоматически не подключаются. Поэтому для I/O передают свой executor.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- CountDownLatch и CyclicBarrier
- Устройство ConcurrentHashMap
- ReentrantLock и synchronized
- Виртуальные потоки