2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论 2 条评论

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

非凸底仓增强算法上线中山证券,智启普惠投资新时代

非凸科技

大数据-74 Kafka 核心机制揭秘:副本同步、控制器选举与可靠性保障

武子康

Java 大数据 kafka 分布式 消息队列

YashanDB如何实现高并发环境下的数据操作

数据库砖家

YashanDB入门教程:构建高效稳定的企业数据库系统

数据库砖家

YashanDB实时数据同步技术及配置方法

数据库砖家

YashanDB事务处理机制及应用场景详解

数据库砖家

YashanDB事务隔离级别详解及优化策略

数据库砖家

工业数据管理的八大痛点,为何总是治标不治本?一次架构重构告诉你答案

TDengine

tdengine 工业数据 idmp

“医” 起穿越三国,开启《脑洞三国》新体验

博文视点Broadview

YashanDB示例项目实战,快速掌握数据库操作技能

数据库砖家

YashanDB事务隔离级别详解,提升企业数据安全性

数据库砖家

青春出码,鸿蒙一夏!2025 HarmonyOS创新赛携手千名开发者解锁开发新范式

最新动态

选择局域网视频软件,让你的开会数据仅在企业内网流转!

BeeWorks

即时通讯 IM 私有化部署

付费功能免费用!!!Yops 运维面板 v0.9 正式发布

Yops-运维易

Linux 程序员 服务器 Linux 运维 #docker

YashanDB容灾备份策略,保障企业关键数据安全无忧

数据库砖家

YashanDB数据安全合规性管理实践分享

数据库砖家

为什么有些企业不用腾讯会议,会单独采购私有化部署的会议系统?

BeeWorks

即时通讯 IM 私有化部署

WebGL开发框架概述

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

详细教程:DNS服务器未响应是怎么回事,有哪些解决方法?

防火墙后吃泡面

YashanDB如何支持企业数字化转型及数据驱动决策

数据库砖家

YashanDB升级及数据迁移的最佳实践总结

数据库砖家

YashanDB事务隔离级别详解及应用场景分析

数据库砖家

在 Amazon Bedrock 中结合 RAG 与 MCP 高效缓解提示词膨胀问题

亚马逊云科技 (Amazon Web Services)

YashanDB入门教程:从零开始掌握数据库核心功能

数据库砖家

YashanDB实现分布式缓存的最佳实践

数据库砖家

YashanDB如何支持大数据处理与实时分析

数据库砖家

别让代码毁了低空经济!80% 风险藏在第三方组件里,SCA是唯一 “透视镜”

安势信息

SCA 开源组件 低空经济 无人机安全 许可证合规

YashanDB如何简化数据合规性管理

数据库砖家

全面掌握 Consul:服务注册发现、健康检查、跨数据中心一网打尽

左诗右码

WebGL开发数字孪生的技术方案

北京木奇移动技术有限公司

数字孪生 软件外包公司 webgl开发

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