我正在运行java8应用程序,它看起来像一旦主线程退出,进程就会退出。
我正在使用completableFuture来启动异步任务,如下所示
CompletableFuture cf = CompletableFuture.supplyAsync(() -> task.call());
cf.thenRunAsync(() -> {
try {
System.out.println(Thread.currentThread());
System.out.println((Double)cf.get() * 4.0);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
});
我希望async作为一个单独的线程运行,因此主线程退出不应该导致进程退出,但事实并非如此。
我猜异步作业是作为deamon线程运行的吗?但无法确认。
答案 0 :(得分:5)
如上所述here:
方法
supplyAsync
使用ForkJoinPool.commonPool()
线程池 这是在CompletableFutures
之间共享的。
如上所述here
ForkJoinPool
在守护进程模式下使用线程,通常不需要 在程序退出时显式关闭这样的池。
所以似乎就是这样。
为避免这种情况,您需要传递一个显式的执行程序,如:
ExecutorService pool = Executors.newFixedThreadPool(5);
final CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
... }, pool);