Какое количество потоков по умолчанию использует параллельный Stream в Java?

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

Ответ

Параллельный стрим (parallelStream()) по умолчанию использует потоки из общего пула (common pool) ForkJoinPool. Уровень параллелизма этого пула равен Runtime.getRuntime().availableProcessors() - 1.

Пример:

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
System.out.println("Доступных процессоров: " + Runtime.getRuntime().availableProcessors());

numbers.parallelStream()
       .forEach(i -> System.out.println(Thread.currentThread().getName()));
// Вывод будет содержать имена потоков вида 'ForkJoinPool.commonPool-worker-N'

Как управлять количеством потоков? По умолчанию изменить нельзя, но можно запустить параллельный стрим внутри своего экземпляра ForkJoinPool:

ForkJoinPool customPool = new ForkJoinPool(4); // Пул с 4 потоками
customPool.submit(() -> 
    list.parallelStream() // Теперь стрим использует customPool, а не commonPool
         .forEach(...)
).join();

Важно: Это глобальная настройка для common pool. Изменять ее для всего приложения через системное свойство java.util.concurrent.ForkJoinPool.common.parallelism не рекомендуется без веских причин.