下面的代码检查来自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();
}
}
答案 0 :(得分:4)
线程池中的线程将在main
完成后继续运行。这就是为什么JVM不会关闭的原因。您需要使用守护程序线程,或者明确关闭池。
以下是一个例子:
ExecutorService ex = Executors.newCachedThreadPool();
// do all your submission work here
ex.shutdown();