写点什么

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

评论 2 条评论

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

详聊微服务观测|从监控到可观测性,我们最终要走向哪里?

尔达Erda

开源 微服务 云原生 APM PaaS

禾木之变:2021我们该如何持续拥抱AI?

脑极体

5分钟速读之Rust权威指南(三十九)unsafe

wzx

rust

模块八 - 设计消息队列存储消息数据的 MySQL 表格

华仔架构训练营

自建开发工具系列-Webkit内存动量监控UI(一)

Tim

FrontEnd 调试工具 Webkit 工具UI

讨论 | 低代码能解决制造业企业数字化转型所面临的问题吗?

优秀

低代码

浅谈云上攻防——Web应用托管服务中的元数据安全隐患

腾讯安全云鼎实验室

安全攻防 云安全 元数据 网络攻防

生命科学领域新工具:北鲲云超算平台,梦启航的地方

北鲲云

边界防御·信息安全保密圈的 “丈八蛇矛”

郑州埃文科技

《持之以恒的从事运动》五

Changing Lin

7月日更

爱奇艺奇秀直播的秒播体验优化实践

爱奇艺技术产品团队

直播 优化

为什么公司应该效仿开源的文化

WorkPlus

深入浅出 Gitalk 留言插件

悟空聊架构

开源 网站 7月日更 网站建设 留言

《面试八股文》之kafka21卷

moon聊技术

kafka 面试

隔壁工程师都馋哭了我的逆向工程IDA,说要给我搓背捏脚

网络安全学海

网络安全 信息安全 渗透测试 漏洞分析 逆向工程

我看 JAVA 之 并发编程【一】FutureTask & Callable

awen

Java 多线程 Callable FutureTask

从零开始学习3D可视化之摄像机

ThingJS数字孪生引擎

大前端 可视化 数字孪生

Linkflow CDP亮相GDMS全球数字营销峰会

Linkflow

CDP 用户画像 数字营销

打造中国数字军人 数军科技携黑科技亮相(北京)军博会

科技热闻

百度程序员推荐的书籍,今天免费送!

百度Geek说

推荐系统的价值观(三十二)

Databri_AI

价值观 推荐系统

架构实战营模块8作业

Geek_649372

架构实战营

pha挖矿系统源码开发

获客I3O6O643Z97

区块链+ PHA矿机挖矿 PHA质押挖矿

Ubuntu Server 20.04搭建zookeeper集群

玏佾

zookeeper 群集安装 搭建 zk 集群部署

前端 JavaScript 实现一个简易计算器

编程三昧

JavaScript 大前端 代码实现

你的直观感受有可能是错的

石云升

学习 认知偏差 7月日更

区块链技术在“三资”监管领域的应用

CECBC

Demo

Command

#架构实战营

如何科学地系统地梳理出CDP的RFP?

Linkflow

面对大规模 K8s 集群,这款诊断利器必须要“粉一波”!

尔达Erda

开源 云原生 operator PaaS kubernete

第一周作业-对比不同公司产品招聘JD

小夏

产品经理训练营 邱岳

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