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多平台发布

相关推荐
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风5 小时前
详解K8S--声明式API
后端
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~6 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
2401_865854889 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
AskHarries9 小时前
Spring Boot集成Access DB实现数据导入和解析
java·spring boot·后端
2401_857622669 小时前
SpringBoot健身房管理:敏捷与自动化
spring boot·后端·自动化