前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java避坑指南:并行化改造,使用CompletableFuture结合流(stream)不能并行执行避坑

Java避坑指南:并行化改造,使用CompletableFuture结合流(stream)不能并行执行避坑

作者头像
崔认知
发布2023-06-20 11:25:50
1.2K0
发布2023-06-20 11:25:50
举报
文章被收录于专栏:nobody

简介


为了提高接口的响应速度,接口内的业务逻辑可实现并行化改造。JUC提供的并发工具

CompletableFuture提供的方法:

代码语言:javascript
复制
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
                                                       Executor executor) {
        return asyncSupplyStage(screenExecutor(executor), supplier);
 }

很容易使用自定义的线程池去异步执行,而且CompletableFuture为我们提高了强大的任务编排和异常处理方法。

在开发中,开发者经常使用CompletableFuture结合stream来实现异步并行化执行

CompletableFuture结合stream来实现并行化,小心没有效果


CompletableFuture结合stream来实现并行化,使用姿势不对,会导致无法达到并行异步化的效果,例如:

核心操作:list -> steam -> map(CompletableFuture) -> map (CompletableFuture::join)-> toList。

运行结果:

在运行过程中,结果都是一个个的顺序执行,而且模拟耗时总时间与依次顺序执行耗时时间相差无几。

CompletableFuture结合stream来实现并行化,使用正确的姿势:一定要拆分成两个流处理,即一定要先拆分出CompletableFuture流,并对此流做终止操作(terminal operation )。

正确姿势:

因为流的中间操作(intermediate operation )是惰性求值,只有遇到终止操作(terminal operation )才会触发对流进行处理求值。

运行结果:

我们一般对流中的元素转换为CompletableFuture,使用终止操作toList方法,使得异步先开始执行,才能达到异步执行的目的。

小结


CompletableFuture结合stream来实现并行化,使用正确的姿势:一定要拆分成两个流处理,即一定要先拆分出CompletableFuture流,并对此流做终止操作(terminal operation ),使得异步先开始执行。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档