结构化并发要解决「一个任务拆出的子任务各自泄漏、失败不会取消兄弟」的问题。这篇用 JDK 27 的 StructuredTaskScope(预览 API,用 --enable-preview 运行)验证:成功汇总、失败传播与取消、取第一个成功、超时(ScopedValue 与虚拟线程见前面的篇目)。
fork 之后、join 之前 u.state() = UNAVAILABLE join 之前调用 u.get() → IllegalStateException: null join 返回的结果列表:[user, orders],总耗时 121 ms(两个 100 ms 的子任务并行);u.state() = SUCCESS,u.get() = user
join 抛 ExecutionException,cause = java.lang.IllegalStateException: 子任务失败 join 在 72 ms 后返回(慢任务要 3000 ms);fail.state() = FAILED,slow.state() = UNAVAILABLE,scope.isCancelled() = true 慢任务是否被中断(收到 InterruptedException):true
anySuccessfulOrThrow 的结果 = 快的,耗时 71 ms(最快的失败了,取第一个成功的) 还在跑的慢任务被中断了吗:true
配置了 withTimeout(200 ms) 的 scope,子任务要 2000 ms:join 抛 ExecutionException,耗时 210 ms fork 了子任务却没有 join 就离开 try-with-resources → IllegalStateException: Owner did not join after forking 子任务运行在 虚拟线程 里(每个 fork 默认一个虚拟线程)