【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

评论 2 条评论

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

一文搞懂Go gRPC服务Handler单元测试

Tony Bai

Go golang gRPC 单元测试 微服务、

【腾讯云云上实验室】用向量数据库——实现高效文本检索功能

熬夜磕代码、

数据库、

Tower for Mac:强大的Git客户端,轻松管理代码版本,提升开发效率

晴雯哥

核药供应链创新:远大医药策略与明道云实践

明道云

为什么chatGPT中文版不需要梯子🪜翻墙,在中国是合法合规的??

Geek_ccdd7f

PolarDB 物理复制刷脏约束问题和解决

ba0tiao

innodb MySQL 数据库 polarDB

花见Live Wallpaper 4K Pro for mac(4k视频壁纸)

展初云

Mac 动态壁纸软件 Mac视频壁纸

好用的图片处理工具 JixiPix Pastello Pro激活最新版

mac大玩家j

Mac软件 图像处理工具 图像编辑器

专业矢量图片转换工具 Vector Magic免激活最新

胖墩儿不胖y

Mac软件 矢量图软件

EndNote 21 文献管理工具 Mac激活版 支持m1

加油,小妞!

文献管理 EndNote 21

数字城市运行监测主题指标设计思路探讨

大黄蜂

Mac模拟飞行驾驶游戏:X-Plane 12 for Mac

彩云

X-Plane 12 飞行模拟游戏

SourceTree for Mac 最新激活 支持M1

彩云

sourcetree SourceTree Mac

GPT-4 API全面开放使用

Geek_ccdd7f

Sensei for Mac(系统优化工具)

展初云

Mac Mac软件 系统优化工具

硬盘监测和系统优化工具推荐Sensei 注册激活版

胖墩儿不胖y

Mac软件 优化软件 系统清理工具

云HIS医院信息化管理系统源码:集团化管理,多租户机制,满足医院业务需求

源码星辰

源码 Java’ 云计算,

【k8s系列】搭建MicroK8s Dashboard教程。

百度搜索:蓝易云

云计算 Linux 运维 Web MicroK8s

sublime text for Mac 注册激活版 附 激活码 支持M1

加油,小妞!

代码编辑器 sublime text

macos好玩的游戏:星际争霸母巢之战汉化激活版最新

mac大玩家j

mac游戏 星际争霸母巢之战破解版

LED驱动控制专用电路

智趣匠

Puppeteer是什么?如何使用Puppeteer实现浏览器自动化

爱写字的阿城

自动化 批量 puppeteer

3D建模软件Rhino 8 for Mac(犀牛)

展初云

Mac 建模软件 Rhino 8 犀牛

Linux系统下获取系统、BIOS、进程、网络等相关信息的方法和工具。

百度搜索:蓝易云

云计算 Linux 运维 云服务器 BIOS

Macbook 电池最大充电限制工具:AlDente Pro for Mac

加油,小妞!

AlDente Pro

Termius for Mac:远程终端管理利器,便捷安全地控制你的服务器

晴雯哥

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