Redian新闻
>
JDK 21中的结构化并发:并发编程的一次飞跃

JDK 21中的结构化并发:并发编程的一次飞跃

公众号新闻

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 StructuredTaskScope.ShutdownOnFailure()) {          Supplier<String>  user  = scope.fork(() ->  findUser());          Supplier<Integer> order = scope.fork(() ->  fetchOrder());          scope.join()            // Join both subtasks                .throwIfFailed();  // ... and propagate errors          // Here, both subtasks have succeeded, so compose their results          return new Response(user.get(), order.get());    }    //...}

这段代码创建了一个新的 StructuredTaskScope,并使用它来创建了两个分支子任务,其中一个执行 findUser(),另一个执行 fetchOrder()。当这两个子任务均完成时,它会使用这两个子任务的结果创建一个新的 Response。

结构化并发是一个预览 API,默认是禁用的。要使用 StructuredTaskScope API,开发人员必须启用预览 API 来编译该代码,如下面的命令所示:

javac --release 21 --enable-preview Main.java

运行该程序也需要相同的标记:

java --enable-preview Main

但是,我们可以使用源码启动器(source code launcher)来直接运行它。在这种情况下,命令行如下所示:

java --source 21 --enable-preview Main.java

使用 jshell 方案也是可以的,不过依然需要启用预览特性:

 jshell --enable-preview

在实践中,使用 StructuredTaskScope 时,大多数情况下都不会直接使用 StructuredTaskScope 类,而是使用两个子类中的某一个,这两个子类均实现了关闭策略。这两个子类,即 ShutdownOnFailure 和 ShutdownOnSuccess,分别支持在第一个子任务失败或成功时关闭作用域的模式。

结构化并发将在不同线程中运行的相关任务视为一个工作单元。这种方式简化了错误处理和取消,提高了可靠性,并增强了可观测性。开发者 Ron Pressler 是甲骨文公司技术员工的咨询成员,并且是 OpenJDK 的 Loom 项目的技术负责人,Alan Bateman 是甲骨文公司 Java 平台组的工程师,他们意图消除与并发编程相关的常见风险,如线程泄露和取消延迟,并增强并发代码的可观测性。

这个新特性的目的并不是要取代 java.util.concurrent 包中的任何并发结构,如 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(https://www.infoq.com/news/2023/06/structured-concurrency-jdk-21/)

声明:本文为 InfoQ 翻译,未经许可禁止转载

今日好文推荐

GitHub Copilot:做出一个划时代的产品,只需要 6 个人

苹果Vision Pro商标撞车华为;Vue作者入驻爱发电赞助平台,称国内赞助非常少;14岁天才少年入职SpaceX|Q资讯

深度:为什么中国数据库领域没有出现像Snowflake这样的巨头?

十七年来奇葩大崩溃!为不让OpenAI和谷歌白拿数据,Reddit 收取巨额API 费用还诽谤开发者,社区爆发大规模抗议

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
4次飞天的景海鹏,和他身上的3个关键词比 JDK 最高快 170 倍,蚂蚁集团开源高性能多语言序列化框架 Fury崽卖爷田不心疼,官花血税有快感!神器还是垃圾?那些用AIGC编程的人,实践得怎么样了闷声干大事!腾讯捐了个JDK!边疆航空无限次飞行通票现价$299,秋冬两季适用【报告】2021-2031中美国增长和衰退最快的行业并发编程 - FutureTask 解析亚毫秒GC暂停到底有多香?JDK17+ZGC初体验神器还是垃圾?那些用 AIGC 编程的人,实践得怎么样了函数式编程的后期架构比JDK最高快170倍,蚂蚁集团开源高性能多语言序列化框架Fury关于并发编程与线程安全的思考与实践LLVM&Swift之父宣布全新AI开发编程语言"Mojo",兼容Python,且快35000倍加州推新网站 助居民应对气候变化并省钱JDK 21从主线fork ,成为下一个Java LTS版本若蓝小诗:炸裂硬核观察 #1022 这是我们所知的计算机编程的终结招募乳腺癌患者@哈尔滨医科大学附属肿瘤医院及全国83家医院 I 吡罗西尼片&全新结构CDK4/6抑制剂程序员的未来属于「伪代码」!Nature专栏:用ChatGPT加速科研编程的三种姿势9 个不需要编码或编程的 IT 和技术工作牛!59岁大妈实现“空姐梦” 成功入职 准备首次飞美AIGC商业化并不乐观音乐满分、打戏精彩、飙车刺激、后续未知,对“速激”而言,合格的结局也是圆满的结束【民调】如果你一生最多只能乘坐四次飞机...不平凡的人生7月21中伏,10大禁忌千万别犯,尤其是第4个(建议收藏)实用分享:麦肯锡 “金字塔原理”:职场人结构化思维、表达和解决问题的利器上古时期程序员在没有 Google 的情况下怎样编程的?Java近期新闻:JDK 21进入Rampdown阶段、JEP 404、JDK 22专家组、Jakarta EE 11升级53岁王菲与助理现身机场,小肚隆起疑似怀孕,谢霆锋或将再次当爹春天的最后浪漫· 爱断情伤Java近期新闻:JDK 21的JEP、Spring Cloud AWS 3.0以及OptaPlanner转移至Timefold阴谋论称毛伊岛大火来自“武器攻击”,否认气候变化并不能阻止灾害发生Wing:人工智能时代的云开发编程语言
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。