Сколько потоков создается в ForkJoinPool по умолчанию?

«Сколько потоков создается в ForkJoinPool по умолчанию?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

По умолчанию ForkJoinPool создает количество потоков, равное количеству доступных процессоров (Runtime.getRuntime().availableProcessors()). Это значение определяет уровень параллелизма (parallelism) пула.

Пример:

ForkJoinPool commonPool = ForkJoinPool.commonPool();
System.out.println(commonPool.getParallelism()); // Выведет, например, 8 на 8-ядерном процессоре

Важные детали:

  • Общий пул (commonPool): Используется по умолчанию для параллельных операций (например, в CompletableFuture и параллельных стримах). Его уровень параллелизма равен количество_ядер - 1.
  • Создание кастомного пула: Можно задать свое значение через конструктор.
    ForkJoinPool customPool = new ForkJoinPool(16); // Пул с параллелизмом 16
  • Принцип работы: Пул использует алгоритм work-stealing — простаивающие потоки "крадут" задачи из очередей занятых потоков, что повышает утилизацию ресурсов.
  • Фактическое число потоков: Может быть меньше уровня параллелизма, если задачи не требуют такого количества, или временно больше для компенсации блокирующих операций.