structuredtaskscope.shutdownonfailure是专为“必须全部成功、任一失败即取消其余任务”场景设计的结构化并发作用域;适用于多下游校验等需强一致失败传播的协作型子任务,非通用线程池替代品。

StructuredTaskScope.ShutdownOnFailure 是什么,什么时候该用它
它不是通用并发工具,而是专为「必须全部成功、任一失败就放弃其余任务」的协作型子任务设计的结构化并发作用域。比如同时调用多个下游服务做数据校验,只要一个返回 400 或抛出 RuntimeException,其他正在跑的请求就得立刻取消——这时才轮到 ShutdownOnFailure 出场。
别把它当 ExecutorService 的替代品;它不管理线程池,也不支持重复提交任务。它的核心职责就一个:统一生命周期 + 失败传播 + 自动清理。
怎么创建和运行任务,关键参数不能漏
必须显式传入 ThreadFactory,否则会抛 NullPointerException(JDK 21 初始实现里没给默认值);同时要记得在 try 块里调用 join(),否则主线程可能提前退出,子任务被静默中断。
家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l
StructuredTaskScope.ShutdownOnFailure scope = new StructuredTaskScope.ShutdownOnFailure(Thread.ofVirtual().factory());- 每个子任务必须用
scope.fork(() -> {...})启动,直接new Thread(...).start()不受管控 - 必须调用
scope.join()才会阻塞等待完成或失败;只调用scope.close()不会等,也不触发异常收集 - 任务中若抛出未捕获的
InterruptedException或RuntimeException,会被捕获并聚合进scope.exception()
失败后怎么取错误信息,常见误判点
scope.exception() 返回的是第一个失败任务抛出的异常,不是所有异常的集合。想看完整失败列表?不行,API 就没提供——这是设计取舍,不是 bug。如果需要多异常诊断,得自己在每个 fork 里加日志或包装成 Result 类型。
立即学习“Java免费学习笔记(深入)”;
- 调用
scope.exception()前必须先确认scope.isFailed()为true,否则返回null,直接.getCause()会 NPE - 如果所有任务都成功,
scope.exception()永远是null,哪怕某个任务里写了System.out.println("error") - 子任务里用
return null或抛Exception(非 RuntimeException)不会触发失败模式——只有未捕获的RuntimeException和InterruptedException才算“失败事件”
和 ShutdownOnSuccess / ShutdownOnExit 的行为差异
三者共享同一套底层调度逻辑,但终止策略完全不同:ShutdownOnFailure 是“一挂全停”,ShutdownOnSuccess 是“一成全停”,ShutdownOnExit 是“不管成败,等全部结束”。选错就等于逻辑翻车。
- 如果你写的是批量导入,要求“只要有一条数据校验失败,就中止整个导入流程”,选
ShutdownOnFailure - 如果你写的是竞速查询(比如查缓存+查 DB+查远程 API,谁先返回用谁),应该用
ShutdownOnSuccess - 如果你只是想确保所有异步清理动作执行完再退出(比如关连接、删临时文件),用
ShutdownOnExit - 混用不同 scope 实例没问题,但同一个 scope 实例不能反复
fork—— 它是一次性的,join()后状态不可重用








