开发-异步多线程
异步多线程
使用 CompletableFuture 进行异步多线程 = 👉 异步执行 + 线程池 + 回调 + 结果聚合
Demo链接
CompletableDemo: SpringBoot框架的多线程异步架构测试demo
整体架构
graph TD
A["UserController"] --> B["UserAggregateService"]
A --> C["UserAllAggregateService"]
B --> D["AsyncQueryService"]
C --> D
D --> E["UserMapper"]
D --> F["OrderMapper"]
D --> G["RoleMapper"]
异步验证方法
单用户聚合接口
/user/detail?userId=xxx
UserAggregateService.aggregate() 中同时发起 3 个异步查询:
| 异步任务 | 说明 |
|---|---|
| queryUser(userId) | 查用户基本信息 |
| queryOrders(userId) | 查用户订单 |
| queryRoles(userId) | 查用户角色 |
三个任务通过 @Async("asyncExecutor") 提交到自定义线程池并行执行,然后用 CompletableFuture.allOf(...).join() 等待全部完成,最后组装成 UserAggregateDTO 返回。
案例
1 | // 请求url |
全量用户聚合接口
/user/all-detail
UserAllAggregateService.queryAllUsersDetail() 更进一步:
先查出所有用户,对每个用户并行发起 queryOrders + queryRoles,用 thenCombine 组合结果
用 allOf().join() 等待所有用户的所有任务完成,打印总耗时。对比串行查询的耗时,并行版本的总耗时约等于最慢的那一次查询,而非所有查询耗时之和。
案例
1 | // 请求url |
注意
该示例中并没有在多线程中加入过多的try-catch异常处理和相关日志,实际在运行时可能出现异常导致线程没有释放,这样的情况要在后序实际应用时补充。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 慕易的书屋!
评论
