Проверяет понимание работы пула потоков в parallelStream и его влияние на производительность.
В Java при вызове метода parallelStream() на коллекции или другом источнике данных, поток выполнения не создает новый пул потоков для каждой операции. Вместо этого используется общий пул потоков — ForkJoinPool.commonPool(). Этот пул создается один раз при запуске JVM и используется всеми параллельными стримами по умолчанию.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// Оба parallelStream используют один commonPool
numbers.parallelStream().forEach(n -> process(n));
numbers.parallelStream().forEach(n -> process(n));
// Создание собственного пула для изоляции
ForkJoinPool customPool = new ForkJoinPool(4);
try {
customPool.submit(() ->
numbers.parallelStream().forEach(n -> process(n))
).get();
} catch (Exception e) {
e.printStackTrace();
} finally {
customPool.shutdown();
}Собственный ForkJoinPool стоит создавать, если:
По умолчанию parallelStream использует общий пул потоков, что может привести к конкуренции за ресурсы. Для критичных или блокирующих операций рекомендуется создавать собственный ForkJoinPool, чтобы избежать взаимной блокировки и обеспечить предсказуемую производительность.