如何询问CompletableFuture使用非守护程序线程?

时间:2017-09-04 08:17:03

标签: java concurrency daemon future completable-future

我写了以下代码:

 System.out.println("Main thread:" + Thread.currentThread().getId());
 CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
     try {
         System.out.println("Before sleep thread:" + Thread.currentThread().getId(), + " isDaemon:" + Thread.currentThread().isDaemon());
          Thread.sleep(100);
          System.out.println("After sleep");
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  });
  future.whenComplete((r, e) -> System.out.println("whenCompleted thread:" + Thread.currentThread().getId()));

并打印出来:

Main thread:1
Before sleep thread:11 isDaemon:true

并完成。

如何更改此行为?

P.S。我在runAsync java doc

中看不到任何相关内容

2 个答案:

答案 0 :(得分:6)

runAsync()的{​​{3}}说:

  

返回一个新的CompletableFuture,它在运行给定操作后由ForkJoinPool.commonPool()中运行的任务异步完成。

另一个版本的runAsync(),您可以传递一个ExecutorService。

因此:当默认javadoc没有达到您想要的效果时 - 请改为创建自己的ExecutorService。

答案 1 :(得分:3)

添加以下行:

ForkJoinPool.commonPool().awaitTermination(5, TimeUnit.SECONDS);
运行你的未来之后的

主要方法。我将阻止,直到池中的所有任务都完成。

  

阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程被中断,以先发生者为准。