Анализирует подводные камни пулов потоков с динамическим ростом.
newCachedThreadPool() создает потоки по требованию и убирает неиспользуемые через 60 секунд. Опасен неограниченным ростом потоков при высокой нагрузке, что приводит к исчерпанию памяти или CPU. Уместен только для редких коротких задач.
Проблемы:
Неограниченное создание потоков:
При лавинообразном запросе (например, DDoS) пул создает тысячи потоков:
ExecutorService pool = Executors.newCachedThreadPool();
// При 10_000 задач → 10_000 потоковЗаканчивается память (OutOfMemoryError: unable to create new native thread).
Замедление работы:
Переключение контекста между потоками расходует CPU.
Когда использовать:
Для нечастых задач с предсказуемым объемом (например, фоновые операции раз в минуту).
Альтернативы:
Фиксированный пул:
Executors.newFixedThreadPool(10); // Максимум 10 потоковОчередь задач:
new ThreadPoolExecutor(
0, // corePoolSize
100, // maxPoolSize (ограничение!)
60L, TimeUnit.SECONDS, // время простоя
new LinkedBlockingQueue<>()
);Вывод: Никогда не используйте newCachedThreadPool() в продакшене для пользовательских запросов.