Кажется невозможным создать пул кэшированных потоков с ограничением количества потоков, которые он может создать.
Вот как статический Executors.newCachedThreadPool реализован в стандартной библиотеке Java:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Итак, используя этот шаблон для создания пула потоков кэширования фиксированного размера:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Теперь, если вы используете это и отправляете 3 задания, все будет хорошо. Отправка любых дальнейших задач приведет к отклоненным исключениям исполнения.
Попробуем это:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
В результате все потоки будут выполняться последовательно. То есть пул потоков никогда не будет создавать более одного потока для выполнения ваших задач.
Это ошибка в методе выполнения ThreadPoolExecutor? Или, может быть, это намеренно? Или есть другой способ?
Edit: я хочу что-то в точности как пул кэшированных потоков (он создает потоки по требованию, а затем убивает их по истечении некоторого времени ожидания), но с ограничением на количество потоков, которые он может создать, и возможностью продолжать ставить в очередь дополнительные задачи как только он достиг своего предела потока. Согласно ответу Сджли это невозможно. Глядя на метод execute () ThreadPoolExecutor, это действительно невозможно. Мне нужно было бы создать подкласс ThreadPoolExecutor и переопределить execute () в некоторой степени, как это делает SwingWorker, но то, что SwingWorker делает в своем execute (), является полным взломом.