2017-05-06 80 views
3

我正在运行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(); 
      } 
     }); 

我希望异步运行作为一个独立的线程,所以主线程退出应该不会导致进程退出,但事实证明并非如此。

我猜异步作业是作为deamon线程运行?但不能确认。

+0

你能更多地讨论你的问题? –

+0

添加代码片段 –

回答

5

如前所述here

方法supplyAsync使用ForkJoinPool.commonPool()线程池,其所有CompletableFutures之间共享 。

而且如前所述here

ForkJoinPool使用线程在后台模式,通常没有必要 明确关机后程序退出这样的游泳池。

所以看来是这样。

为了避免这种情况,你需要传递一个明确的执行,如:

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