为了账号安全,请及时绑定邮箱和手机立即绑定

Executors.newCachedThreadPool()与Executors.newFixed

Executors.newCachedThreadPool()与Executors.newFixed

慕容森 2019-12-09 10:25:22
newCachedThreadPool() 与 newFixedThreadPool()什么时候应该使用其中一个?就资源利用而言,哪种策略更好?
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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


newFixedThreadPool


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


newCachedThreadPool


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


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


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


查看完整回答
反对 回复 2019-12-09
?
翻阅古今

TA贡献1780条经验 获得超5个赞

如果您不担心可调用/可运行任务的无限队列,则可以使用其中之一。正如布鲁诺建议,我也喜欢newFixedThreadPool到newCachedThreadPool这两者之间。


但ThreadPoolExecutor的 规定相比,它更灵活的功能newFixedThreadPool或newCachedThreadPool


ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 

TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,

RejectedExecutionHandler handler)

好处:


您可以完全控制BlockingQueue的大小。与前两个选项不同,它不是无限的。由于系统中出现意外的动荡,未完成的可调用/可运行任务的大量堆积,我不会出现内存不足的错误。


您可以实施自定义拒绝处理策略,也可以使用以下策略之一:


默认情况下ThreadPoolExecutor.AbortPolicy,处理程序在拒绝时引发运行时RejectedExecutionException。


在中ThreadPoolExecutor.CallerRunsPolicy,调用执行自己的线程运行任务。这提供了一种简单的反馈控制机制,将降低新任务提交的速度。


在中ThreadPoolExecutor.DiscardPolicy,简单地删除了无法执行的任务。


在中ThreadPoolExecutor.DiscardOldestPolicy,如果未关闭执行程序,则将丢弃工作队列开头的任务,然后重试执行(这可能再次失败,从而导致重复执行此操作)。


您可以为以下用例实现自定义线程工厂:


设置更具描述性的线程名称

设置线程守护程序状态

设置线程优先级


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 1566 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信