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

相关推荐
luckdewei1 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某2 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy2 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom2 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
用户1474853079747 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1237 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3657 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马7 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
码事漫谈7 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端
吃饱了得干活8 小时前
深入解析 OpenFeign:从重试、拦截到负载均衡的全维度实践
后端