Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: threadpool, executor, concurrency, performance

Какие проблемы может вызвать Executors.newCachedThreadPool()? Когда его уместно применять?

Анализирует подводные камни пулов потоков с динамическим ростом.

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

newCachedThreadPool() создает потоки по требованию и убирает неиспользуемые через 60 секунд. Опасен неограниченным ростом потоков при высокой нагрузке, что приводит к исчерпанию памяти или CPU. Уместен только для редких коротких задач.

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

Проблемы:

  1. Неограниченное создание потоков:

    • При лавинообразном запросе (например, DDoS) пул создает тысячи потоков:

      ExecutorService pool = Executors.newCachedThreadPool();
      // При 10_000 задач → 10_000 потоков
    • Заканчивается память (OutOfMemoryError: unable to create new native thread).

  2. Замедление работы:

    • Переключение контекста между потоками расходует CPU.

Когда использовать:

  • Для нечастых задач с предсказуемым объемом (например, фоновые операции раз в минуту).

Альтернативы:

  • Фиксированный пул:

    Executors.newFixedThreadPool(10); // Максимум 10 потоков
  • Очередь задач:

    new ThreadPoolExecutor(
        	0,                      // corePoolSize
        	100,                    // maxPoolSize (ограничение!)
        	60L, TimeUnit.SECONDS,  // время простоя
        	new LinkedBlockingQueue<>()
    );

Вывод: Никогда не используйте newCachedThreadPool() в продакшене для пользовательских запросов.

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Java

    Java

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

#threadpool

#executor

#concurrency

#performance

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