如何要求completablefuture使用非守护线程?

ep6jt1vc  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(750)

我编写了以下代码:

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、 我在美国没有看到任何相关的 runAsync java文档

7cjasjjr

7cjasjjr1#

添加此行:

ForkJoinPool.commonPool().awaitTermination(5, TimeUnit.SECONDS);

到主方法后运行你的未来。我将阻止,直到池中的所有任务都完成。
在关闭请求、超时或当前线程中断(以先发生的为准)之后,阻塞直到所有任务都已完成执行。

0g0grzrc

0g0grzrc2#

的javadoc runAsync() 说:
返回新的completablefuture,该Future由运行给定操作后在forkjoinpool.commonpool()中运行的任务异步完成。
还有另一个版本的 runAsync() 在那里你可以传递服务。
因此:当默认的commonpool()不能执行您想要的操作时,请创建您自己的executorservice。

相关问题