有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
| 453: | Structured Concurrency (Preview) |
什么是结构化并发(Structured Concurrency)?
结构化并发是一种用于简化并发编程的API。它将在不同线程中运行的相关任务组视为一个单独的工作单元,从而简化错误处理和取消操作,提高可靠性,并增强可观察性。
为什么需要结构化并发?
传统的并发编程模型,如ExecutorService
API,由于其无限制的并发模式,引入了复杂性和风险。这些模型没有强制执行或跟踪任务和子任务之间的关系,使得管理和观察并发任务变得困难。结构化并发模型认为任务结构应该反映代码结构,在单线程代码中,执行总是强制实施任务和子任务的层次结构,每个子任务的生命周期相对于其他子任务受到代码的语法块结构的控制。
结构化并发旨在消除与并发编程相关的常见风险,例如线程泄漏和取消延迟,并增强并发代码的可观察性。
结构化并发的实现原理
结构化并发通过引入新的API来实现,其中最重要的类是StructuredTaskScope
。StructuredTaskScope
封装了一组相关的任务,这些任务应该一起完成,如果任何子任务失败,则会取消剩余的子任务。
在结构化并发中,使用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
类,而是使用实现关闭策略的两个子类之一。这些子类分别是ShutdownOnFailure
和ShutdownOnSuccess
,支持当第一个子任务失败或成功时关闭作用域的模式。 - 运行结构化并发程序时,需要使用
--enable-preview
选项启用预览功能。
总结
结构化并发是一种用于简化并发编程的API,它将相关任务组合成一个单元,从而简化错误处理和取消操作,提高可靠性,并增强可观察性。通过引入StructuredTaskScope
类和相关的子类,结构化并发提供了一种更简单、更直观的方式来处理并发任务。然而,需要注意的是,结构化并发目前仍处于预览阶段,并且需要启用预览功能才能使用。
JDK 21 将是大多数供应商的长期支持 (LTS) 版本。有关自上一个 LTS 版本 JDK 17 以来集成的 JEP 的完整列表,请参阅 here.
本文由mdnice多平台发布