Одним из решений для этого является использование очереди емкостью 0 и java.util.concurrent.ThreadPoolExecutor.AbortPolicy
в качестве RejectedExecutionHandler
.
Статические методы в Executors
не предоставляют полный набор параметров, которые вы хотите для этого, так что вам нужно будет создать экземпляр ThreadPoolExecutor
напрямую.В вашем случае вы могли бы использовать следующее:
new ThreadPoolExecutor(4, /* Core pool size */
4, /* Max pool size */
0, TimeUnit.SECONDS, /* Core th. keep-alive */
new MyQueue<Runnable>(0), /* No queueing allowed */
Executors.defaultThreadFactory(), /* default */
new AbortPolicy()) /* throws when all core threads busy */
Несколько замечаний:
- 0 секунд (3-й и 4-й аргументы) соответствуют ядрувремя поддержки потокаУстановка 0 означает, что ваши основные потоки никогда не будут остановлены, даже если они остаются бездействующими.Это поведение по умолчанию при использовании
Executors.newFixedThreadPool(4)
. Executors.defaultThreadFactory()
- фабрика потоков по умолчанию, такая же, как при использовании Executors.newFixedThreadPool(4)
. - Здесь размер ядра и максимального пула потоков установлен на4 (1-й и 2-й аргумент), который для вашего случая использования кажется подходящим.
MyQueue
- это реализация BlockingQueue
, которая принимает 0 в качестве емкости (т.е. которая может быть только пустой. Это, конечно,не очередь, но реализация этого позволяет беспрепятственно интегрироваться с ThreadPoolExecutor
, предоставленным JDK.).
Дальнейшее рассмотрение :
При такой тонкой настройке вашего пула потоков, имейте в виду, что пропускная способность будет ограничена.Здесь, учитывая 4 потока и среднюю задержку L
в секундах для задач, переданных в пул потоков, средняя пропускная способность, разрешенная этой конфигурацией, составляет 4/L
задач / секунду.