使用ScheduledThreadPoolExecutor允许核心线程超时

时间:2018-01-24 14:04:32

标签: java multithreading threadpoolexecutor

你能解释一下,为什么ScheduledThreadPoolExecutor javadoc是这样的:

  

此外,将corePoolSize设置为几乎绝不是一个好主意       零或使用allowCoreThreadTimeOut因为这可能会使游泳池没有       一旦它们有资格运行就完成处理任务的线程。

我已经尝试分析在必须执行新任务时如何在此线程池中创建新线程,并且我认为javadoc中描述的问题不应该发生。

1 个答案:

答案 0 :(得分:3)

线程池试图使工作线程数等于corePoolSize,以通过缓存线程来提高效率。允许核心线程超时与此目的相反。如果允许核心线程超时,则将执行新任务,但会导致重复创建和销毁工作线程。

如果设置allowCoreThreadTimeOut = true,则在工作线程在任务队列中找不到任务并且超时之后,即使工作线程的数量小于corePoolSize,它们也将被销毁。因此,如果您此时提交新任务,则线程池必须创建新线程。

如果设置allowCoreThreadTimeOut = false,那么在工作线程找不到任务队列中的任务和工作线程数小于corePoolSize之后,它们将不会被销毁并继续等待新任务。< / p>