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

相关推荐
组合缺一2 小时前
Solon Cloud Gateway 开发:熟悉 ExContext 及相关接口
java·后端·gateway·solon
幸好我会魔法4 小时前
人格分裂(交互问答)-小白想懂Elasticsearch
大数据·spring boot·后端·elasticsearch·搜索引擎·全文检索
SomeB1oody5 小时前
【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
开发语言·后端·rust
何中应5 小时前
从管道符到Java编程
java·spring boot·后端
组合缺一6 小时前
Solon Cloud Gateway 开发:Route 的过滤器与定制
java·后端·gateway·reactor·solon
SomeB1oody6 小时前
【Rust自学】15.4. Drop trait:告别手动清理,释放即安全
开发语言·后端·rust
customer086 小时前
【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源
花心蝴蝶.8 小时前
Spring IoC & DI
java·后端·spring
半夏知半秋8 小时前
rust学习-所有权
开发语言·后端·学习·rust
Ciderw9 小时前
TCP三次握手和四次挥手
开发语言·网络·c++·后端·网络协议·tcp/ip·golang