【发布时间】:2020-08-11 05:02:08
【问题描述】:
池大小=8,活动线程=0,排队任务=0,已完成任务=5678。为什么当线程池处于活动状态时活动线程为 0。有人可以解释一下吗。应该大于0吧?
【问题讨论】:
-
由于没有代码,我猜你是在执行完成后读取了属性,所以执行器不再占用线程
池大小=8,活动线程=0,排队任务=0,已完成任务=5678。为什么当线程池处于活动状态时活动线程为 0。有人可以解释一下吗。应该大于0吧?
【问题讨论】:
我怀疑你将核心池大小设置为零,或者你说让核心线程超时。
allowCoreThreadTimeOut( true )引用ThreadPoolExecutorJavadoc 的 Keep-alive 时间 部分:
默认情况下,keep-alive 策略仅适用于 corePoolSize 线程以上,但方法
allowCoreThreadTimeOut(boolean)也可用于将此超时策略应用到核心线程,只要 keepAliveTime 值为 non -零。
将 true 或 false 传递给该方法:
[设置] 如果在保活时间内没有任务到达,核心线程是否可以超时并终止,当新任务到达时根据需要替换。
setCorePoolSize( 0 )如果将核心池大小设置为零,所有线程最终都会超时。在这种情况下,设置allowCoreTheadTimeOut 是无关紧要的。
请参阅该 Javadoc 页面的 回收 部分:
您可以通过设置适当的保持活动时间、使用零核心线程的下限和/或设置 allowCoreThreadTimeOut(boolean) 来配置池以允许所有未使用的线程最终终止。
【讨论】: