小编典典

Executors.newCachedThreadPool() 与 Executors.newFixedThreadPool()

all

newCachedThreadPool()相对newFixedThreadPool()

我什么时候应该使用其中一种?在资源利用方面哪种策略更好?


阅读 78

收藏
2022-07-29

共1个答案

小编典典

我认为文档很好地解释了这两个函数的区别和用法:

newFixedThreadPool

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads
个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。池中的线程将一直存在,直到显式关闭。

newCachedThreadPool

创建一个线程池,根据需要创建新线程,但在可用时将重用以前构造的线程。这些池通常会提高执行许多短期异步任务的程序的性能。如果可用,对执行的调用将重用以前构造的线程。如果没有可用的现有线程,将创建一个新线程并将其添加到池中。六十秒内未使用的线程将被终止并从缓存中删除。因此,保持空闲足够长时间的池不会消耗任何资源。请注意,可以使用
ThreadPoolExecutor 构造函数创建具有相似属性但细节不同(例如超时参数)的池。

在资源方面,newFixedThreadPool它将保持所有线程运行,直到它们被显式终止。在newCachedThreadPool60
秒内未使用的线程将被终止并从缓存中删除。

鉴于此,资源消耗将在很大程度上取决于具体情况。例如,如果您有大量长时间运行的任务,我建议使用FixedThreadPool.
至于CachedThreadPool,文档说“这些池通常会提高执行许多短期异步任务的程序的性能”。

2022-07-29