Кажется, невозможно создать кэшированный пул потоков с ограничением количества потоков, которые он может создать.
Вот как статический 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? Или, может быть, это намеренно? Или есть другой способ?
Изменить: я хочу что-то точно такое, как пул кешированных потоков (он создает потоки по требованию, а затем убивает их после некоторого таймаута), но с ограничением количества потоков, которые он может создать, и возможностью продолжать очереди дополнительных задач как только он достигнет предела потока. Согласно sjlee-ответу это невозможно. Глядя на метод execute() ThreadPoolExecutor, это действительно невозможно. Мне нужно было бы подклассировать ThreadPoolExecutor и переопределить execute(), как это делает SwingWorker, но то, что SwingWorker делает в своем execute(), является полным взломом.