【问题标题】:ThreadPoolExecutor application does not FinishThreadPoolExecutor 应用程序未完成
【发布时间】:2015-06-04 01:55:21
【问题描述】:

这个超级简单的应用程序打印“Hello”但没有完成。我完全没有理由这样做。

JavaDoc,部分定稿,说

程序中不再引用且没有剩余线程的池将自动关闭。

tpe 显然没有被引用,这意味着线程没有完成。但我不明白为什么。谁能解释一下?

这种情况的解决方法是在main的最后调用shutdown(),但是我的实际应用比较复杂。新的工作是在 Runnables 内部生成的,所以我不知道什么时候会处理所有内容。

那么,我需要弄清楚何时调用关机吗?或者是否有可能以某种方式指定,当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");
        }
    });
}

}

【问题讨论】:

  • 继续阅读直到最后。您必须确保未使用的线程死亡。

标签: java multithreading concurrency java.util.concurrent threadpoolexecutor


【解决方案1】:

当您的 main 方法完成时,您的 executor 没有剩余任务,但它仍然有线程在运行。

在提交任何任务之前将标志 allowCoreThreadTimeout 设置为 true。然后,当您的执行程序在 main 方法完成时超出范围,并且您的所有任务都完成时,线程将被终止。请参阅ThreadPoolExecutor API documentation 中的最终确定:

程序中不再引用且没有剩余线程的池将自动关闭。如果您想确保即使用户忘记调用 shutdown() 也能回收未引用的池,那么您必须安排未使用的线程最终死亡,方法是设置适当的保持活动时间,使用零核心线程的下限和/或设置allowCoreThreadTimeOut(boolean)。

【讨论】:

    【解决方案2】:

    或者是否有可能以某种方式指定,当 tpe 的队列为空时,而不是关闭自身? - 不。即使有可能,当您创建对象时,tpe 的队列也会为空首先会关闭。

    但您可以使用ThreadPoolExecutor.getActiveCount() 了解当前正在运行的线程数。如果它达到 0 并停留一段时间,您可以关闭执行器。

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 2014-12-20
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多