繁体   English   中英

ThreadPoolExecutor应用程序未完成

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM