2017-05-06 82 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);