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

相关推荐
小池先生19 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
wm10432 小时前
java web springboot
java·spring boot·后端
龙少95434 小时前
【深入理解@EnableCaching】
java·后端·spring
溟洵6 小时前
Linux下学【MySQL】表中插入和查询的进阶操作(配实操图和SQL语句通俗易懂)
linux·运维·数据库·后端·sql·mysql
SomeB1oody8 小时前
【Rust自学】6.1. 定义枚举
开发语言·后端·rust
SomeB1oody8 小时前
【Rust自学】5.3. struct的方法(Method)
开发语言·后端·rust
啦啦右一10 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien10 小时前
Spring Boot常用注解
java·spring boot·后端
盛派网络小助手12 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#