似乎不可能创建一个对可以创建的线程数有限制的缓存线程池。
下面是静态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
和覆盖,但它所做的是一个完整的hack。execute()
SwingWorker
SwingWorker
execute()