似乎不可能创建一个缓存的线程池,并限制它可以创建的线程数量。
下面是静态 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 的回答,这是不可能的。看看 ThreadPoolExecutor
的 execute()
方法确实是不可能的。我需要像 SwingWorker
那样子类 ThreadPoolExecutor
并覆盖 execute()
,但是 SwingWorker
在它的 execute()
中所做的是一个完整的黑客行为。