结构化并发(Structured Concurrency)
Java 21 引入了结构化并发(Structured Concurrency),这是一个让并发编程更安全、更易维护的特性。
我之前写异步代码的时候,经常遇到这样的问题:主任务启动了多个子任务,但主任务取消了,子任务还在后台跑,导致资源泄漏或者奇怪的 bug。
结构化并发就是为了解决这个问题:让子任务的生命周期与作用域绑定。
今天我们就来把结构化并发彻底讲透。
一、为什么需要结构化并发
1.1 传统并发的问题
问题:
- 子任务泄漏:父任务取消后,子任务还在跑
- 错误处理复杂:需要手动管理多个 Future
- 线程生命周期不明确:不知道线程什么时候该结束
1.2 结构化并发的目标
特点:
- 子任务在 scope 内启动
- scope 关闭时,子任务自动取消
- 错误自动传播
- 线程生命周期与代码结构一致
二、StructuredTaskScope
2.1 基本用法
2.2 ShutdownOnFailure:一个失败,全部取消
2.3 ShutdownOnSuccess:一个成功,取消其他
三、【直观类比】
【直观类比】
结构化并发就像"团队会议":
四、错误处理
4.1 异常传播
4.2 多个异常
4.3 自定义 Scope
五、与虚拟线程结合
5.1 完美配合
结构化并发和虚拟线程是天然搭档:
5.2 为什么虚拟线程需要结构化并发
六、生产最佳实践
6.1 ✅ 正确示例:并行获取多个数据
6.2 ✅ 正确示例:超时控制
6.3 ❌ 错误示例:在 scope 外使用 fork 的 Future
正确做法:
七、面试追问链
第一层:基础概念
面试官问:"结构化并发是什么?"
Java 21 引入的特性,通过 StructuredTaskScope 把子任务的生命周期绑定到代码块。scope 关闭时,子任务自动取消。
第二层:ShutdownOnFailure vs ShutdownOnSuccess
面试官问:"ShutdownOnFailure 和 ShutdownOnSuccess 有什么区别?"
ShutdownOnFailure:一个子任务失败时,取消其他所有子任务。ShutdownOnSuccess:第一个子任务成功时,取消其他子任务。适用场景不同。
第三层:与虚拟线程的关系
面试官问:"结构化并发和虚拟线程有什么关系?"
结构化并发需要虚拟线程来发挥最大效果。虚拟线程的挂起机制让结构化并发的调度更高效。两者结合可以写出既安全又高效的并发代码。
【学习小结】
- StructuredTaskScope 管理子任务的生命周期
- ShutdownOnFailure:一个失败,全部取消
- ShutdownOnSuccess:一个成功,取消其他
- scope 关闭时自动取消所有子任务
- 与虚拟线程天然配合
- 避免子任务泄漏问题