[英]ThreadPoolExecutor application does not Finish
这个超级简单的应用程序会打印“ Hello”,但不会完成。 我绝对没有理由这样做。
JavaDoc (本节定稿)说
程序中不再引用且没有剩余线程的池将自动关闭。
显然没有引用tpe
,这意味着线程没有完成。 但是我不明白为什么。 有人可以解释吗?
这种情况下的解决方案是在main的末尾调用shutdown(),但是我的实际应用更加复杂。 新工作是在Runnable内部生成的,所以我不知道什么时候会处理完所有内容。
因此,我是否需要弄清楚何时调用shutdown? 还是可以通过某种方式指定当tpe
的队列为空时,它应该自行关闭?
public class JavaApplication5 {
public static void main(String[] args) {
ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 15, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
tpe.execute(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
});
}
}
当您的主要方法完成时,您的执行器没有剩下的任务 ,但是它仍在运行线程。
在提交任何任务之前,将标志allowCoreThreadTimeout设置为true。 然后,当您的执行程序在main方法完成时超出范围并且您的所有任务完成时,线程将终止。 请参阅ThreadPoolExecutor API文档中的Finalization :
程序中不再引用且没有剩余线程的池将自动关闭。 如果即使在用户忘记调用shutdown()的情况下仍要确保收回未引用的池,则必须使用零核心线程的下限和/或通过设置适当的保持存活时间,安排未使用的线程最终死掉设置allowCoreThreadTimeOut(boolean)。
还是可以通过某种方式指定,当tpe的队列为空时,而不是关闭自身? -否。即使有可能,当您第一次创建对象时,tpe的队列也将为空,因此将关闭。
但是您可以使用ThreadPoolExecutor.getActiveCount()
来了解当前正在运行多少个线程。 如果它达到0并停留一段时间,则可以关闭执行程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.