退出的主线程是否会杀死异步任务?

时间:2017-05-06 03:12:18

标签: java multithreading

我正在运行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线程运行的吗?但无法确认。

1 个答案:

答案 0 :(得分:5)

如上所述here

  

方法supplyAsync使用ForkJoinPool.commonPool()线程池   这是在CompletableFutures之间共享的。

如上所述here

  

ForkJoinPool在守护进程模式下使用线程,通常不需要   在程序退出时显式关闭这样的池。

所以似乎就是这样。

为避免这种情况,您需要传递一个显式的执行程序,如:

ExecutorService pool = Executors.newFixedThreadPool(5);
final CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                ... }, pool);