Как настроить пул потоков
Вопрос
Как вы выбираете и настраиваете пул потоков для сервиса?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Параметры ThreadPoolExecutor и порядок core, очередь, max, отказ
Ограниченная очередь и политика отказа вместо фабрик Executors
Размер пула: CPU-задачи около числа ядер, I/O больше
Отдельные пулы для разных видов работы (bulkhead)
Имена потоков, метрики, graceful shutdown
Виртуальные потоки как альтернатива для I/O
Что могут спросить следом
- Что будет, если задача внутри пула ждёт другую задачу этого же пула?
- Какую политику отказа выберете и почему?
Разбор
Создаю ThreadPoolExecutor явно, а не через фабрики Executors, потому что fixed-пул имеет неограниченную очередь, а cached-пул неограниченное число потоков. Помню порядок: сначала core-потоки, потом очередь, потом рост до max, потом политика отказа. Очередь ограничиваю, политику выбираю осознанно: отклонить и отдать 503, или CallerRunsPolicy, чтобы притормозить источник. Размер для вычислений около числа ядер, для I/O больше, оцениваю по доле ожидания и проверяю нагрузкой. Разные виды работы развожу по разным пулам, чтобы медленный внешний сервис не съел все потоки. Даю потокам имена, вывожу метрики очереди и активных потоков, при остановке делаю shutdown и awaitTermination. На Java 21 для чисто I/O-задач часто проще взять виртуальные потоки, а ограничение параллелизма выразить семафором. Ещё одна ловушка: задача, которая ждёт другую задачу того же пула, может его заблокировать.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что делает ThreadPoolExecutor с новой задачей
Следующий вопрос
Виртуальные потоки: как устроены и когда брать
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- null в ConcurrentHashMap
- CompletableFuture без executor
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier