JDK21更新内容:结构化并发编程

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址

文章更新计划

文章更新计划


| 453: | Structured Concurrency (Preview) |

什么是结构化并发(Structured Concurrency)?

结构化并发是一种用于简化并发编程的API。它将在不同线程中运行的相关任务组视为一个单独的工作单元,从而简化错误处理和取消操作,提高可靠性,并增强可观察性。

为什么需要结构化并发?

传统的并发编程模型,如ExecutorService API,由于其无限制的并发模式,引入了复杂性和风险。这些模型没有强制执行或跟踪任务和子任务之间的关系,使得管理和观察并发任务变得困难。结构化并发模型认为任务结构应该反映代码结构,在单线程代码中,执行总是强制实施任务和子任务的层次结构,每个子任务的生命周期相对于其他子任务受到代码的语法块结构的控制。

结构化并发旨在消除与并发编程相关的常见风险,例如线程泄漏和取消延迟,并增强并发代码的可观察性。

结构化并发的实现原理

结构化并发通过引入新的API来实现,其中最重要的类是StructuredTaskScopeStructuredTaskScope 封装了一组相关的任务,这些任务应该一起完成,如果任何子任务失败,则会取消剩余的子任务。

在结构化并发中,使用StructuredTaskScope 创建一个作用域,在该作用域内可以派生出多个子任务。这些子任务将被视为整体,并且它们之间存在依赖关系。当所有子任务完成后,可以对它们进行处理,例如获取结果或抛出异常。

结构化并发的优点

  • 简化并发编程:结构化并发提供了一种更简单、更直观的方式来处理并发任务。
  • 错误处理和取消操作:通过将相关任务组合成一个单元,结构化并发使错误处理和取消操作更加容易和可靠。
  • 提高可靠性:结构化并发模型消除了常见的风险,如线程泄漏和取消延迟,从而提高了并发代码的可靠性。
  • 增强可观察性:结构化并发模型使得观察并发任务的执行状态变得更加方便。

结构化并发的缺点

  • 预览功能:目前,结构化并发仍处于预览阶段,需要启用预览功能才能使用。

结构化并发的使用示例

下面是一个使用结构化并发的示例代码:

java 复制代码
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()            
             .throwIfFailed();  

        
        return new Response(user.get(), order.get());
    }
    
}

在这个示例中,我们创建了一个新的StructuredTaskScope作用域,并使用它派生了两个子任务:一个执行findUser() 方法,另一个执行fetchOrder()方法。一旦两个子任务都完成,就可以使用它们的结果创建一个新的Response对象。

结构化并发的使用注意事项

  • 结构化并发是一个预览功能,默认情况下被禁用。要使用StructuredTaskScope API,开发人员必须启用预览功能来编译代码。
  • 使用结构化并发时,通常不直接使用StructuredTaskScope 类,而是使用实现关闭策略的两个子类之一。这些子类分别是ShutdownOnFailureShutdownOnSuccess,支持当第一个子任务失败或成功时关闭作用域的模式。
  • 运行结构化并发程序时,需要使用--enable-preview选项启用预览功能。

总结

结构化并发是一种用于简化并发编程的API,它将相关任务组合成一个单元,从而简化错误处理和取消操作,提高可靠性,并增强可观察性。通过引入StructuredTaskScope 类和相关的子类,结构化并发提供了一种更简单、更直观的方式来处理并发任务。然而,需要注意的是,结构化并发目前仍处于预览阶段,并且需要启用预览功能才能使用。

JDK 21 将是大多数供应商的长期支持 (LTS) 版本。有关自上一个 LTS 版本 JDK 17 以来集成的 JEP 的完整列表,请参阅 here.

本文由mdnice多平台发布

相关推荐
派大鑫wink5 小时前
【Day39】Spring 核心注解:@Component、@Autowired、@Configuration 等
java·后端·spring
Java程序员威哥6 小时前
Java应用容器化最佳实践:Docker镜像构建+K8s滚动更新(生产级完整模板+避坑指南)
java·开发语言·后端·python·docker·kubernetes·c#
源代码•宸6 小时前
Golang原理剖析(defer、defer面试与分析)
开发语言·经验分享·后端·面试·golang·defer·开放编码
南山乐只6 小时前
Java并发原生工具:原子类 (Atomic Classes)
java·开发语言·后端
爱丽_6 小时前
Spring 框架
java·后端·spring
小北方城市网6 小时前
SpringBoot 集成 RabbitMQ 实战(消息队列):实现异步通信与系统解耦
java·spring boot·后端·spring·rabbitmq·mybatis·java-rabbitmq
sunnyday04267 小时前
从混乱到清晰:Maven 依赖版本管理最佳实践
java·spring boot·后端·maven
雨中飘荡的记忆7 小时前
Spring Test 从入门到实战
java·后端·spring
晨非辰7 小时前
C++波澜壮阔40年|类和对象篇:拷贝构造与赋值重载的演进与实现
运维·开发语言·c++·人工智能·后端·python·深度学习
韩立学长8 小时前
基于Springboot琴行学生课程信息管理系统2gt392wb(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端