JDK 21 中的结构化并发:并发编程的一次飞跃
作者 | A N M Bazlur Rahman
译者 | 张卫滨
策划 | 丁晓昀
(资料图)
JEP 453,结的次结构化并发(预览)已经从 JDK 21 的构化 Targeted 状态变更为 Integrated 状态。这个最初的并发并发编程预览特性来源于一个孵化 API,它根据前两轮的飞跃孵化纳入了一些改进,这两轮孵化分别是结的次 JDK 19 交付的JEP 428,结构化并发(孵化)和 JDK 20 交付的构化JEP 437,结构化并发(第二轮孵化)。并发并发编程在当前提案中,飞跃唯一的结的次显著变化是StructuredTaskScope::fork(...)方法返回一个[Subtask],而不是构化Future。这是并发并发编程一个预览特性。
JDK 21 中的飞跃结构化并发致力于引入结构化并发的 API 来简化并发编程。这种方法将在不同线程中运行的结的次相关任务组视为一个工作单元,从而简化了错误处理和取消,构化提高了可靠性,并发并发编程并增强了可观测性。我们看一个样例:
Response handle() throws ExecutionException, InterruptedException { try (var scope = new ()) { Supplieruser = (() ->findUser()); Supplierorder = (() ->fetchOrder()); () // Join both subtasks .throwIfFailed(); // ... and propagate errors // Here, both subtasks have succeeded, so compose their results return new Response((), ()); } //...}
这段代码创建了一个新的StructuredTaskScope,并使用它来创建了两个分支子任务,其中一个执行 findUser() ,另一个执行 fetchOrder() 。当这两个子任务均完成时,它会使用这两个子任务的结果创建一个新的 Response 。
结构化并发是一个预览 API,默认是禁用的。要使用 StructuredTaskScope API,开发人员必须启用预览 API 来编译该代码,如下面的命令所示:
javac --release 21 --enable-preview
运行该程序也需要相同的标记:
java --enable-preview Main
但是,我们可以使用源码启动器(source code launcher)来直接运行它。在这种情况下,命令行如下所示:
java --source 21 --enable-preview
使用jshell方案也是可以的,不过依然需要启用预览特性:
jshell --enable-preview
在实践中,使用 StructuredTaskScope 时,大多数情况下都不会直接使用 StructuredTaskScope 类,而是使用两个子类中的某一个,这两个子类均实现了关闭策略。这两个子类,即 ShutdownOnFailure 和 ShutdownOnSuccess ,分别支持在第一个子任务失败或成功时关闭作用域的模式。
结构化并发将在不同线程中运行的相关任务视为一个工作单元。这种方式简化了错误处理和取消,提高了可靠性,并增强了可观测性。开发者Ron Pressler是甲骨文公司技术员工的咨询成员,并且是 OpenJDK 的Loom项目的技术负责人,Alan Bateman是甲骨文公司 Java 平台组的工程师,他们意图消除与并发编程相关的常见风险,如线程泄露和取消延迟,并增强并发代码的可观测性。
这个新特性的目的并不是要取代包中的任何并发结构,如ExecutorService和Future。它的目的也不是为 Java 平台定义明确的结构化并发 API,或在线程间共享数据流的方法。
当前的并发编程模型,如 ExecutorService API,由于其不受限制的并发模式,引入了复杂性和风险。这些模型不会强制要求或跟踪任务和子任务之间的关系,使得并发任务的管理和可观测性很具挑战性。
结构化并发提出,任务结构应该反映代码结构。在单线程代码中,执行过程总是会强制保证任务和子任务的层次结构,每个子任务相对于其他子任务的生命周期是由代码的语法块结构来管理的。
新的 StructuredTaskScope 为 ExecutorService 提供了一个更简单、更安全地替代方案。这个 API 封装了一组应该一起完成的相关任务,任何子任务的失败都会导致其余子任务的取消。
有关这些变更的更多细节,包括代码示例和对该功能背后动机的全面讨论,请参阅OpenJDK的网站。
这个新的 API 是使并发编程更容易、更可靠和更具可观测性的重要一步。预计它对构建可维护的、可靠的和可观测的服务器应用尤为有利。对深入了解结构化并发感兴趣,或愿意学习其相关背景的开发人员可以收听InfoQ Podcast、Ron Pressler 的YouTube课程和Inside Java的文章。
原文链接:
Structured Concurrency in JDK 21: A Leap Forward in Concurrent Programming
本文转载来源:
/article/1NdPKQpZJGmKxm2v6SP2
我要评论
- 提交
最新评论(0)
- 暂无评论
社会民生推荐
- 2025-05-19 17:45:39京东重庆消费券怎么领在哪里领 重庆消费券领取方法
- 2025-05-19 17:45:39梁静茹在上海开过几次演唱会?梁静茹上一次演唱会是哪一年?
- 2025-05-19 17:45:3916万吨荔枝没人要!越南求助,想让中方当“接盘侠”,支持不?
- 2025-05-19 17:45:39全球热头条丨事业编借调到组织部,应该去吗?
- 2025-05-19 17:45:39世界摔联积分赛比什凯克站:周凤女子68公斤级摘金
- 2025-05-19 17:45:39太阳镜片选择什么材质好?防蓝光镜片和普通镜片的区别是什么?
- 2025-05-19 17:45:39三星堆博物馆在哪?四川省广汉三星堆出了多个世界之最
- 2025-05-19 17:45:39全球信息:养老金收入3500在四川是什么水平?
- 2025-05-19 17:45:39五一火车票什么时候开售?2023年五一假期火车票好抢吗?购票时间表
- 2025-05-19 17:45:39张玉环提出2234万赔偿金成热点,咋感觉这糊涂案焦点跑偏呢?
热门事件
- 2025-05-19 17:45:39QQ阅读订阅规则变动:不支持起点读书、红袖添香互通
- 2025-05-19 17:45:39交警贴罚单的时发现车在头一天已经贴过了,那他还会再贴吗?
- 2025-05-19 17:45:39赵文卓参演的电影有哪些? 中国武术排名第一是谁?
- 2025-05-19 17:45:39恒大在广东有哪些楼盘?广东买房的条件是什么?
- 2025-05-19 17:45:392023WTT新加坡大满贯赛程比赛时间表 男女单打决赛时间
- 2025-05-19 17:45:39皇后那拉氏姓氏争议有哪些?雍正是否篡位?
- 2025-05-19 17:45:39生活垃圾分类指南是什么?垃圾围城是什么意思?
- 2025-05-19 17:45:39垃圾分类有几种垃圾桶?喝过的奶茶杯属于什么垃圾分类?
- 2025-05-19 17:45:39抖音丹霞地貌 ? 结果悲剧了
- 2025-05-19 17:45:39每日精选:孟晚舟再次占据热搜排行榜第一,这表明了什么?
最新热点
- 2025-05-19 17:45:39京东拆快递多少满级?京东618拆快递上限是多少
- 2025-05-19 17:45:39环球快播:煤矿招不来工人,为什么还不精简机关人员提高职工工资?
- 2025-05-19 17:45:39柚子蒸熟发苦能吃吗?柚子和螃蟹可以一起吃吗?
- 2025-05-19 17:45:39打乙肝疫苗能要孩子吗?打乙肝疫苗能喝酒吗?
- 2025-05-19 17:45:39四只大熊猫凑一桌像在打麻将 网友:深得川渝人民的真传
- 2025-05-19 17:45:39烫完头发不卷了怎么办?头发烫完不卷怎么补救?
- 2025-05-19 17:45:39世界速递!出口转内销是什么意思
- 2025-05-19 17:45:39涂了SPF50防晒还会晒黑吗?为什么会晒黑?
- 2025-05-19 17:45:39国家移民管理局:超3200个出入境窗口恢复护照签证等受理审批
- 2025-05-19 17:45:39蛋清打发不起来怎么补救?蛋清打发不起来是怎么回事呢?