Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: parallelStream, ForkJoinPool, common pool, thread pool, Java streams

Создается ли отдельный пул потоков для каждого parallelStream?

Проверяет понимание работы пула потоков в parallelStream и его влияние на производительность.

Короткий ответ

Нет, для каждого parallelStream не создается отдельный пул потоков. Все parallelStream по умолчанию используют общий ForkJoinPool.commonPool(). Это единый пул потоков для всех параллельных операций в JVM. Если нужно изолировать выполнение, можно использовать собственный ForkJoinPool.

Длинный ответ

Как работает пул потоков в parallelStream

В Java при вызове метода parallelStream() на коллекции или другом источнике данных, поток выполнения не создает новый пул потоков для каждой операции. Вместо этого используется общий пул потоков — ForkJoinPool.commonPool(). Этот пул создается один раз при запуске JVM и используется всеми параллельными стримами по умолчанию.

Особенности commonPool

  • Размер commonPool по умолчанию равен количеству ядер процессора минус 1 (но не менее 1).
  • Все parallelStream в приложении конкурируют за потоки из одного пула.
  • Если один parallelStream выполняет долгую операцию, это может заблокировать другие параллельные стримы.

Пример кода

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 стоит создавать, если:

  • Выполняются блокирующие операции (I/O, ожидание внешних сервисов).
  • Нужно изолировать выполнение от других параллельных задач.
  • Требуется контроль над количеством потоков.

Вывод

По умолчанию parallelStream использует общий пул потоков, что может привести к конкуренции за ресурсы. Для критичных или блокирующих операций рекомендуется создавать собственный ForkJoinPool, чтобы избежать взаимной блокировки и обеспечить предсказуемую производительность.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#parallelStream

#ForkJoinPool

#common pool

#thread pool

#Java streams

Подпишись на Java Developer в телеграм