Используют ли параллельные стримы в Java один общий пул потоков ForkJoinPool?

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

Ответ

Да, параллельные стримы (например, созданные через Collection.parallelStream()) по умолчанию используют общий пул потоков ForkJoinPool.commonPool().

Почему это важно:

  • Общий ресурс: Все параллельные стримы в JVM делят один пул, что может привести к конкуренции и снижению производительности, если несколько задач выполняются одновременно.
  • Настройка: Можно запустить стрим в собственном пуле, передав его в ForkJoinPool.

Пример использования общего пула:

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
long sum = numbers.parallelStream() // Использует ForkJoinPool.commonPool()
                  .mapToInt(i -> i)
                  .sum();

Пример использования кастомного пула:

ForkJoinPool customPool = new ForkJoinPool(4);
long sum = customPool.submit(() -> 
    numbers.parallelStream() // Теперь использует customPool
           .mapToInt(i -> i)
           .sum()
).get();

Best practice: Для изоляции и контроля производительности критичных задач используйте отдельный ForkJoinPool.