【问题标题】:Why Java program not terminating为什么Java程序没有终止
【发布时间】:2014-03-21 11:06:14
【问题描述】:

下面的代码从Java Concurrency 框架检查ExecutorCompletionService 的使用情况(使用的IDE 是Netbeans)。

但是程序并没有终止。为什么?

代码:

import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.Executors;

public class TestFuture {

    public static void main(String... args) throws InterruptedException, ExecutionException {
        Executor ex = Executors.newCachedThreadPool();
        CompletionService<Long> cs = new ExecutorCompletionService<Long>(ex);
        cs.submit(new Worker());
        cs.submit(new Worker());
        cs.submit(new Worker());
        for (int i = 0; i < 3; i++) {
            long l = cs.take().get();
            //utilize the result
            System.out.println(l);
        }
    }
}

class Worker implements Callable {

    @Override
    public Long call() throws Exception {
        //do some task and return back
        return System.currentTimeMillis();
    }
}

【问题讨论】:

  • 您需要暂停(关闭)线程池,或者将线程指定为守护进程。
  • 使用ExecutorService#shutdown()

标签: java concurrency future executors


【解决方案1】:

main 完成时,线程池中的线程将继续运行。这就是JVM不会关闭的原因。您需要使用守护线程,或者显式关闭池。

这是一个例子:

ExecutorService ex = Executors.newCachedThreadPool();
// do all your submission work here
ex.shutdown();

【讨论】:

  • 谢谢。在我在互联网上看到的示例中,他们从未提到关闭线程池,并且示例使用了 Executor,它没有 shutdown/halt 行为。 :)
  • 另外,awaitTermination() 如果你需要阻塞直到线程真正停止 - shutdown() 立即返回。
猜你喜欢
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2019-12-21
  • 2020-07-19
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多