乐趣区

关于java:JDK-21-中的结构化将带来发编程的一次飞跃

最近,JEP 453,结构化并发(预览)曾经从 JDK 21 的 Targeted 状态变更为 Integrated 状态。这个最后的预览个性来源于一个孵化 API,它依据前两轮的孵化纳入了一些改良,这两轮孵化别离是 JDK 19 交付的 JEP 428,结构化并发(孵化)和 JDK 20 交付的 JEP 437,结构化并发(第二轮孵化)。在以后提案中,惟一的显著变动是 StructuredTaskScope::fork(…) 办法返回一个 [Subtask],而不是 Future。

JDK 21 中的结构化并发致力于引入结构化并发的 API 来简化并发编程。这种办法将在不同线程中运行的相干工作组视为一个工作单元,从而简化了错误处理和勾销,进步了可靠性,并加强了可观测性。咱们看一个样例:

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()            // Join both subtasks
                .throwIfFailed();  // ... and propagate errors
          // Here, both subtasks have succeeded, so compose their results
          return new Response(user.get(), order.get());
    }
    //...
}

这段代码创立了一个新的 StructuredTaskScope,并应用它来创立了两个分支子工作,其中一个执行 findUser(),另一个执行 fetchOrder()。当这两个子工作均实现时,它会应用这两个子工作的后果创立一个新的 Response。

结构化并发是一个预览 API,默认是禁用的。要应用 StructuredTaskScope API,开发人员必须启用预览 API 来编译该代码,如上面的命令所示:

javac --release 21 --enable-preview Main.java

运行该程序也须要雷同的标记,如下:

java --enable-preview Main

然而,咱们能够应用源码启动器(source code launcher)来间接运行它。在这种状况下,命令行如下所示:

java --source 21 --enable-preview Main.java

不过,应用 jshell 计划也是能够的,不过仍然须要启用预览个性,命令如下:

 jshell --enable-preview

在实践中,应用 StructuredTaskScope 时,大多数状况下都不会间接应用 StructuredTaskScope 类,而是应用两个子类中的某一个,这两个子类均实现了敞开策略。这两个子类,即 ShutdownOnFailure 和 ShutdownOnSuccess,别离反对在第一个子工作失败或胜利时敞开作用域的模式。

结构化并发将在不同线程中运行的相干工作视为一个工作单元。这种形式简化了错误处理和勾销,进步了可靠性,并加强了可观测性。开发者 Ron Pressler 是甲骨文公司技术员工的征询成员,并且是 OpenJDK 的 Loom 我的项目的技术负责人,Alan Bateman 是甲骨文公司 Java 平台组的工程师,他们用意打消与并发编程相干的常见危险,如线程泄露和勾销提早,并加强并发代码的可观测性。

这个新个性的目标并不是要取代 java.util.concurrent 包中的任何并发构造,如 ExecutorService 和 Future。它的目标也不是为 Java 平台定义明确的结构化并发 API,或在线程间共享数据流的办法。以后的并发编程模型,如 ExecutorService API,因为其不受限制的并发模式,引入了复杂性和危险。这些模型不会强制要求或跟踪工作和子工作之间的关系,使得并发工作的治理和可观测性很具挑战性。

结构化并发提出,工作构造应该反映代码构造。在单线程代码中,执行过程总是会强制保障工作和子工作的层次结构,每个子工作绝对于其余子工作的生命周期是由代码的语法块构造来治理的。

新的 StructuredTaskScope 为 ExecutorService 提供了一个更简略、更平安地代替计划。这个 API 封装了一组应该一起实现的相干工作,任何子工作的失败都会导致其余子工作的勾销。

无关这些变更的更多细节,包含代码示例和对该性能背地动机的全面探讨,请参阅 OpenJDK 的网站。这个新的 API 是使并发编程更容易、更牢靠和更具可观测性的重要一步。预计它对构建可保护的、牢靠的和可观测的服务器利用尤为无利。

原文链接:https://www.infoq.com/news/2023/06/structured-concurrency-jdk…

退出移动版