ACachedThreadPool
似乎适合您的情况,因为直接将一个用于长时间运行的线程没有负面影响。java 文档中关于 CachedThreadPools 适合短任务的评论只是表明它们特别适合这种情况,而不是它们不能用于长时间运行的任务。
a 的主要问题CachedThreadPool
是它会创建多达Integer.MAX_VALUE
数量的线程,因为如果缓存中不存在未使用的线程,它总是会产生一个新线程。因此,如果您有长时间运行的任务,那么您更有可能增加并发线程的数量超过您的预期,因为这种类型的线程池不会限制有多少并发执行本身。如上所述,这对于您的用例来说似乎不是问题,但需要注意。
CachedThreadPool
为了进一步详细说明 a和 a之间的区别FixedThreadPool
,Executors.newCachedThreadPool和Executors.newFixedThreadPool都通过 的实例由相同的线程池实现(至少在开放的 JDK 中)支持ThreadPoolExecutor
,只是参数不同。区别只是它们的线程最小值、最大值、线程终止时间和队列类型。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
当您实际上想要使用固定数量的线程时, AFixedThreadPool
确实有其优势,因为那时您可以向执行器服务提交任意数量的任务,同时知道线程数将保持在您指定的级别。如果您明确想要增加线程数,那么这不是合适的选择。
然而,这确实意味着您可能遇到的一个问题CachedThreadPool
是关于限制并发运行的线程数。这CachedThreadPool
不会为您限制它们,因此您可能需要编写自己的代码以确保您不会运行太多线程,您可以通过ThreadPoolExecutor
使用所需的行为特征实例化您自己的线程来相对容易地做到这一点。这实际上取决于您的应用程序的设计以及如何将任务提交给执行器服务。