似乎不可能创建一个限制其可以创建的线程数量的缓存线程池。
这是静态的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()
是一个完整的黑客。