【问题标题】:No threads left running after using ThreadPoolExecutor in Java在 Java 中使用 ThreadPoolExecutor 后没有线程继续运行
【发布时间】:2020-08-11 05:02:08
【问题描述】:

池大小=8,活动线程=0,排队任务=0,已完成任务=5678。为什么当线程池处于活动状态时活动线程为 0。有人可以解释一下吗。应该大于0吧?

【问题讨论】:

  • 由于没有代码,我猜你是在执行完成后读取了属性,所以执行器不再占用线程

标签: java threadpoolexecutor


【解决方案1】:

tl;博士

我怀疑你将核心池大小设置为零,或者你说让核心线程超时。

allowCoreThreadTimeOut( true )

引用ThreadPoolExecutorJavadoc 的 Keep-alive 时间 部分:

默认情况下,keep-alive 策略仅适用于 corePoolSize 线程以上,但方法 allowCoreThreadTimeOut(boolean) 也可用于将此超时策略应用到核心线程,只要 keepAliveTime 值为 non -零。

将 true 或 false 传递给该方法:

[设置] 如果在保活时间内没有任务到达,核心线程是否可以超时并终止,当新任务到达时根据需要替换。

setCorePoolSize( 0 )

如果将核心池大小设置为零,所有线程最终都会超时。在这种情况下,设置allowCoreTheadTimeOut 是无关紧要的。

请参阅该 Javadoc 页面的 回收 部分:

您可以通过设置适当的保持活动时间、使用零核心线程的下限和/或设置 allowCoreThreadTimeOut(boolean) 来配置池以允许所有未使用的线程最终终止。

【讨论】:

  • 谢谢。这个线程池是由 Spring 框架创建的,我没有。我确信核心池大小不为零。此线程池用于出站通道将数据发送到 webscokets 中的客户端。我看到数据作为连续流发送到客户端,但线程池的活动计数为零。所以,正如你所说,有一个选项可以终止核心池大小的空闲线程,你认为这就是我能够看到活动线程为 0 的原因吗?
  • @Pavani 要获得更具体的答案,您需要发布更具体的代码,MCVE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2017-10-07
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多