写点什么

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

  • 2023-06-25
    北京
  • 本文字数:1793 字

    阅读完需:约 6 分钟

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类,而是使用两个子类中的某一个,这两个子类均实现了关闭策略。这两个子类,即ShutdownOnFailureShutdownOnSuccess,分别支持在第一个子任务失败或成功时关闭作用域的模式。


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


这个新特性的目的并不是要取代java.util.concurrent包中的任何并发结构,如ExecutorServiceFuture。它的目的也不是为 Java 平台定义明确的结构化并发 API,或在线程间共享数据流的方法。

当前的并发编程模型,如ExecutorService API,由于其不受限制的并发模式,引入了复杂性和风险。这些模型不会强制要求或跟踪任务和子任务之间的关系,使得并发任务的管理和可观测性很具挑战性。


结构化并发提出,任务结构应该反映代码结构。在单线程代码中,执行过程总是会强制保证任务和子任务的层次结构,每个子任务相对于其他子任务的生命周期是由代码的语法块结构来管理的。


新的StructuredTaskScopeExecutorService提供了一个更简单、更安全地替代方案。这个 API 封装了一组应该一起完成的相关任务,任何子任务的失败都会导致其余子任务的取消。


有关这些变更的更多细节,包括代码示例和对该功能背后动机的全面讨论,请参阅OpenJDK的网站。

这个新的 API 是使并发编程更容易、更可靠和更具可观测性的重要一步。预计它对构建可维护的、可靠的和可观测的服务器应用尤为有利。对深入了解结构化并发感兴趣,或愿意学习其相关背景的开发人员可以收听InfoQ Podcast、Ron Pressler 的YouTube课程和Inside Java的文章。


原文链接:

Structured Concurrency in JDK 21: A Leap Forward in Concurrent Programming


相关阅读:

Java 近期新闻:JDK 21 进入 Rampdown 阶段、JEP 404、JDK 22 专家组、Jakarta EE 11 升级

快速实现不打折扣的云原生 Java 应用

JEP 444:JDK 21 中出现虚拟线程,开创并发新纪元

2023-06-25 12:576678

评论 2 条评论

发布
用户头像
大神解读下,跟CompletableFuture的区别是什么?
2023-06-26 14:52 · 上海
回复
更简单了
2023-06-29 10:52 · 四川
回复
没有更多了
发现更多内容

如何设计电商行业亿级用户秒杀系统

奈学教育

大数据

架构方法论学习总结

架构师训练营-架构方法:架构师如何做架构

Pontus

极客大学架构师训练营

S型曲线 - 第一曲线

石云升

S型曲线 第一曲线 连续性创新

课后总结-20200606

caibird1984

架构师(week1)总结

满山李子

学习总结

Mr.Monkey

第一周学习总结:

武鹏

极客架构师训练营第一周

大丁💸💵💴💶🚀🐟

SaaS:小企业向左、大企业向右

人称T客

微服务架构中分布式事务实现方案怎样何取舍

奈学教育

微服务架构中分布式事务实现方案怎样何取舍【转发】

古月木易

微服务

架构第一周-学习总结

J.Smile

极客大学架构师训练营

LeetCode | 3. Roman to Integer 罗马数字转整数

Puran

算法 LeetCode arts

你现在极有可能是一个「铁锤人」

非著名程序员

读书笔记 程序员 提升认知 认知提升

「架构师训练营」第1周学习总结

guoguo 👻

极客大学架构师训练营

JDK 15 JAVA 15的新特性展望

程序那些事

Java JVM Java 25 周年 新特性

java程序员从小工到专家成神之路(2020版)

程序那些事

Java 学习 Java 25 周年

游戏夜读 | 研发运营怎么分成?

game1night

日志标准化解析的关键内容

secisland

日志 态势感知 关联分析 解析规则 标准化

架构师训练营第1周——学习总结

在野

极客大学架构师训练营

中台迷局丨只做IT的中台是个神棍

人称T客

陈虻语录(摘)

YoungZY

读书

当选择越来越多,我们为什么反而越来越不开心

董一凡

生活 情感

极客时间<<架构师训练营>>第一周作业

好名字

极客大学架构师训练营 作业 第0期

ARTS week 04

刘昱

食堂就餐卡系统架构设计

武鹏

ARTS Week 1

黑色柳丁

ARTS 打卡计划

陆强作业

Mr.Monkey

第一周总结 - 架构文档

孙志平

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十)编写测试-参数化测试

编程道与术

Java 学习 编程 TDD 单元测试

JDK 21中的结构化并发:并发编程的一次飞跃_编程语言_A N M Bazlur Rahman_InfoQ精选文章