你能解释一下,为什么ScheduledThreadPoolExecutor
javadoc是这样的:
此外,将
corePoolSize
设置为几乎绝不是一个好主意 零或使用allowCoreThreadTimeOut
因为这可能会使游泳池没有 一旦它们有资格运行就完成处理任务的线程。
我已经尝试分析在必须执行新任务时如何在此线程池中创建新线程,并且我认为javadoc中描述的问题不应该发生。
答案 0 :(得分:3)
线程池试图使工作线程数等于corePoolSize
,以通过缓存线程来提高效率。允许核心线程超时与此目的相反。如果允许核心线程超时,则将执行新任务,但会导致重复创建和销毁工作线程。
如果设置allowCoreThreadTimeOut = true
,则在工作线程在任务队列中找不到任务并且超时之后,即使工作线程的数量小于corePoolSize
,它们也将被销毁。因此,如果您此时提交新任务,则线程池必须创建新线程。
如果设置allowCoreThreadTimeOut = false
,那么在工作线程找不到任务队列中的任务和工作线程数小于corePoolSize
之后,它们将不会被销毁并继续等待新任务。< / p>