在使用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
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
的结果。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。