看起来似乎不可能创建一个带有线程数量限制的缓存线程池。
以下是标准Java库中静态Executors.newCachedThreadPool
的实现方式:
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个任务,一切都会正常。再提交更多的任务将会导致“rejected execution exceptions”异常。
尝试以下代码:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
将导致所有线程顺序执行。也就是说,线程池永远不会创建多个线程来处理您的任务。
这是ThreadPoolExecutor
的execute
方法中的一个错误吗?还是故意为之?或者有其他方法吗?
编辑:我想要像缓存线程池一样的东西(它按需创建线程,然后在一些超时后终止它们),但限制其可以创建的线程数量,并且在达到线程限制后能够继续排队其他任务。根据sjlee的回答,这是不可能的。查看ThreadPoolExecutor
的execute()
方法,确实不可能。我需要子类化ThreadPoolExecutor
并覆盖execute()
,有点像SwingWorker
所做的那样,但SwingWorker
在其execute()
中所做的是完全的hack。