newCachedThreadPool()相对newFixedThreadPool()
newCachedThreadPool()
newFixedThreadPool()
我什么时候应该使用其中一种?在资源利用方面哪种策略更好?
我认为文档很好地解释了这两个函数的区别和用法:
newFixedThreadPool
创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads 个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。池中的线程将一直存在,直到显式关闭。
newCachedThreadPool
创建一个线程池,根据需要创建新线程,但在可用时将重用以前构造的线程。这些池通常会提高执行许多短期异步任务的程序的性能。如果可用,对执行的调用将重用以前构造的线程。如果没有可用的现有线程,将创建一个新线程并将其添加到池中。六十秒内未使用的线程将被终止并从缓存中删除。因此,保持空闲足够长时间的池不会消耗任何资源。请注意,可以使用 ThreadPoolExecutor 构造函数创建具有相似属性但细节不同(例如超时参数)的池。
在资源方面,newFixedThreadPool它将保持所有线程运行,直到它们被显式终止。在newCachedThreadPool60 秒内未使用的线程将被终止并从缓存中删除。
鉴于此,资源消耗将在很大程度上取决于具体情况。例如,如果您有大量长时间运行的任务,我建议使用FixedThreadPool. 至于CachedThreadPool,文档说“这些池通常会提高执行许多短期异步任务的程序的性能”。
FixedThreadPool
CachedThreadPool