ThreadPoolExecutor应用程序没有完成

时间:2015-06-04 01:55:22

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

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

JavaDoc,部分定稿,表示

  

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

显然没有引用

tpe,这意味着线程没有完成。但我不明白为什么。有人可以解释一下吗?

这种情况下的解决方案是在main的末尾调用shutdown(),但我的实际应用程序更复杂。 Runnables内部产生了新的工作,所以我不知道什么时候会处理所有内容。

那么,我是否需要确定何时调用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");
        }
    });
}

}

2 个答案:

答案 0 :(得分:5)

当您的main方法完成后,执行程序没有任务,但它仍然有线程在运行。

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

中的最终确定
  

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

答案 1 :(得分:-1)

还是可以以某种方式指定,当tpe的队列为空时,关闭本身? - 否。即使有可能,tpe的队列也会首先创建对象时为空,因此会关闭。

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