Кажется, невозможно создать пул кэшированных потоков с ограничением количества потоков, которые он может создать.
Вот как статический 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 (), - это полный взлом.