开发者社区 > 云原生 > 微服务 > 正文

CompletableFuture在allOf后join,总耗时是各子线程耗时之和?子线程最长耗时?

在使用CompletableFuture的过程中遇到一些疑惑,我们都知道在主线程中将所有子线程join起来将会产生阻塞,那么这个阻塞时长是各子线程耗时之和还是子线程最长耗时?

以下是编写的示例代码,大概意思为:在controller中使用for调service10次,service方法使用Async注解标注,方法中sleep3s,最终打印的阻塞时长是12s左右,既不是各子线程耗时之和,也不是子线程最长耗时。。。。。。

controller


    @GetMapping("/case0")
    public Boolean case0() throws InterruptedException, ExecutionException {
        StopWatch watch = new StopWatch();

        List<CompletableFuture<Boolean>> futures = new ArrayList<>();
        watch.start("start-调用createUser-10次");
        for (int i = 0; i < 10; i++) {
            CompletableFuture<Boolean> future = userService.createUser();
            futures.add(future);
        }
        watch.stop();
        watch.start("join所有的future");
        CompletableFuture[] array = futures.toArray(new CompletableFuture[futures.size()]);
        CompletableFuture.allOf(array).join();
        watch.stop();
        String s = watch.prettyPrint();
        System.out.println(s);
        return true;
    }


service:



 @Async("threadPoolExecutor")
 public CompletableFuture<Boolean> createUser() throws InterruptedException {
        Thread.sleep(3000);
        return CompletableFuture.completedFuture(true);
 }

输出:



StopWatch '': running time = 12039974600 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
007285200  000%  start-调用createUser-10次
12032689400  100%  join所有的future

展开
收起
Naylor 2023-07-05 18:10:51 505 0
2 条回答
写回答
取消 提交回答
  • CompletableFuture.allOf()方法用于等待所有给定的CompletableFuture完成。它返回一个新的CompletableFuture,该CompletableFuture将在所有子任务完成后完成。然后,你可以使用join()方法来获取结果。

    当使用CompletableFuture.allOf().join()时,总耗时是各个子线程耗时之和。这是因为allOf()只是等待所有的CompletableFuture完成,并不会对每个子任务的执行时间进行累加。

    例如,如果有两个子任务A和B,执行时间分别为3秒和5秒,那么调用CompletableFuture.allOf(A, B).join()将会等待3秒+5秒=8秒,直到所有子任务都完成。

    需要注意的是,allOf()只是等待所有子任务完成,并不能保证子任务的完成顺序。如果你需要按照特定顺序处理结果,可以使用thenApply()thenAccept()等方法来依次处理每个CompletableFuture的结果。

    2023-07-27 21:31:14
    赞同 展开评论 打赏
  • 所有的子线程都是同一时间开始执行执行的吗

    2023-07-05 20:41:09
    赞同 展开评论 打赏

为微服务建设降本增效,为微服务落地保驾护航。

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载