为什么Java程序不能终止

时间:2014-03-21 11:06:15

标签: java concurrency future executors

下面的代码检查来自ExecutorCompletionService框架的Java Concurrency的使用情况(正在使用的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();
    }
}

1 个答案:

答案 0 :(得分:4)

线程池中的线程将在main完成后继续运行。这就是为什么JVM不会关闭的原因。您需要使用守护程序线程,或者明确关闭池。

以下是一个例子:

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