java结构化并发通过structuredtaskscope将子任务生命周期绑定作用域,提供shutdownonfailure(全成功或任一失败即取消其余)、shutdownonsuccess(首个成功即返回并取消其余)及手动控制三种模式,需配合try-with-resources使用。

Java结构化并发(Structured Concurrency)通过 StructuredTaskScope 将多个子任务的生命周期绑定到一个作用域内,确保它们作为整体启动、协作完成,并统一处理异常与取消——本质上把一组并发操作封装成一个可管理、可预测的“工作单元”。
用 StructuredTaskScope.ShutdownOnFailure 组合必须全部成功的工作
适用于所有子任务都需成功、任一失败即中止其余任务的场景(如并行校验多个参数、聚合多个必需API响应)。
- 创建作用域实例:
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { ... } - 每个子任务调用
scope.fork(() -> doWork())启动,返回Future - 调用
scope.join()等待全部完成;若任一任务抛出异常,join()抛出ExecutionException,且其余仍在运行的任务会被自动取消 - 通过
scope.resultOf(future)安全获取已完成任务的结果(会检查是否被取消或异常)
用 StructuredTaskScope.ShutdownOnSuccess 实现“首个成功即返回”
适合“竞速”类任务,例如同时向多个缓存节点查询、调用多个降级服务接口,取最先返回的有效结果。
- 作用域在首个子任务成功完成时自动关闭,其余任务被取消
- 调用
scope.join()后,用scope.result()获取第一个成功结果(类型需一致) - 若全部失败或超时,
join()抛出对应异常(如ExecutionException或TimeoutException) - 注意:所有任务必须返回相同类型,否则编译不通过
手动管理生命周期:使用 StructuredTaskScope 基类
当需要更精细控制(如自定义取消策略、混合成功/失败逻辑、或延迟关闭),可直接继承或组合 StructuredTaskScope。
- 调用
fork()启动任务后,可随时调用cancel()主动终止整个作用域 - 通过
handleComplete()注册回调,在每个子任务结束时执行清理或统计 - 务必在
try-with-resources中使用,确保作用域退出时自动close(),释放线程资源 - 避免在作用域外持有
Future并长期等待——这会破坏结构化语义
配合虚拟线程提升吞吐,但别忽略作用域边界
结构化并发与虚拟线程天然契合,推荐在 ScopedValue 或 ThreadLocal 需要跨任务传递上下文时使用虚拟线程。
- 启动作用域时,可指定
Executor,传入Executors.newVirtualThreadPerTaskExecutor() - 每个
fork()任务默认在新虚拟线程中运行,轻量且高并发 - 关键点:作用域的生命周期仍由代码块决定,不是线程池生命周期;即使用了虚拟线程,也不能跳出
try块去等待子任务 - 不要在
fork的 lambda 中捕获并忽略异常——结构化并发依赖异常传播来协调取消
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











