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

CompletableFuture без executor

Вопрос

В каком пуле выполнится CompletableFuture.supplyAsync(() -> httpCall()) без второго аргумента?

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

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

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

Коротко

Правильный ответ: В ForkJoinPool.commonPool(), общем на всё приложение. Без executor Async методы используют общий ForkJoinPool (с параллелизмом около числа ядер минус один; если параллелизм пула равен 1, создаётся новый поток на каждую задачу).

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

  1. В новом платформенном потоке, отдельном для каждой задачи
  2. В пуле виртуальных потоков, если версия Java 21
  3. В ForkJoinPool.commonPool(), общем на всё приложениеправильный ответ
  4. В вызывающем потоке, как обычный синхронный вызов метода

Разбор

Без executor *Async методы используют общий ForkJoinPool (с параллелизмом около числа ядер минус один; если параллелизм пула равен 1, создаётся новый поток на каждую задачу). Блокирующий HTTP-вызов там занимает поток и тормозит все параллельные стримы и другие async-задачи. Виртуальные потоки в Java 21 автоматически не подключаются. Поэтому для I/O передают свой executor.

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

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

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