写点什么

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:575721

评论 2 条评论

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

多场景PAI-Diffusion中文模型家族大升级,12个模型、2个工具全部开源

阿里云大数据AI技术

人工智能 阿里云

软件测试/测试开发丨使用ChatGPT自动进行需求分析

测试人

人工智能 程序员 软件测试 需求分析 ChatGPT

为什么越来越多的学校使用云桌面?

青椒云云电脑

桌面云 云桌面

关于Taro你需要了解这些

Onegun

小程序 taro 小程序架构

HiAI Foundation助力端侧音视频AI能力,高性能低功耗释放云侧成本

HarmonyOS SDK

huawei HarmonyOS

在对接自有账户体系时,FinClip 是怎么做的?

Onegun

用户 账户管理 账户体系

产教融合 | 力软联合重庆科技学院开展低代码应用开发培训

力软低代码开发平台

12个强大的 JavaScript 动画库,可帮助你提升用户体验

互联网工科生

JavaScript 动画库

安全检测演进,AIGC融合模糊测试开启新时代

云起无垠

网路安全

软件开发文档大全(项目管理、开发、实施、交付、评审、投标支撑)

金陵老街

Vue java;

Mac电脑十六进制编辑器 010 Editor 激活永久版

胖墩儿不胖y

代码编辑器 Mac软件

对齐管理后台中账户体系的四种方法

FN0

单点登录 账户体系

企业高管IT战略指南——为何要落地平台工程

York

容器 DevOps 云原生 敏捷 平台工程

腾讯云 CODING 入选“数智影响力”数字化转型创新典型案例

CODING DevOps

英特尔产品组合针对多规模AI模型性价比优势明显

E科讯

软件测试/测试开发丨学会与 AI 对话,高效提升学习效率

测试人

人工智能 AI 软件测试 ChatGPT

用户级协议和框架:DPDK、SPDK和VPP的业务场景和发展趋势

统信软件

中国智能卡车“遥遥领先”:卡车NOA落地5000万公里0事故,全球首个

Openlab_cosmoplat

人工智能 自动驾驶

Footprint Analytics 团队参与 Token 2049,为多场活动以及演讲提供数据支持

Footprint Analytics

区块链 公链

Footprint Analytics 为 Layer2 公链提供数据支持,助力新兴项目发展

Footprint Analytics

区块链 公链 layer2

云桌面怎么选,好产品的标准是什么

青椒云云电脑

桌面云 云桌面

大模型的东风中,看雄安的数字飞翔

脑极体

数字化

腾讯云生态以退为进,让「半条命」撑起「半边天」

ToB行业头条

十种数据库缓存相关的技术和机制

树上有只程序猿

数据库

使用融云 CallPlus SDK,一小时实现一款 1V1 视频应用

融云 RongCloud

android 音视频 通信 API CallPlus SDK

什么是网络营销?做网络营销怎么用代理IP?

巨量HTTP

IP

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