1

结构化并发:

一个简单的原则,即当执行流分成多个并发流时,它们会在同一个代码块中重新加入。

资源

基于此,假设我有如下内容:

//can replace this with Virtual thread
public static void delegateTask() {
    Thread delegator = new Thread(new TaskDeligator());
    delegator.setName("TaskDeligatorThread");
    logger.info("Creating task delegator thread....which will register listeners");
    delegator.start();
}

问题 1: 我创建了一个新的子线程(TaskDeligatorThread),但没有在同一个代码块中完成/结束/重新加入,即方法delegateTask() - 这是否意味着它不遵循结构化并发原则?

问题 2: 可能存在 Thread1 想要将某些任务委托给子线程(Thread1 将创建)而 Thread1 不需要等待子线程的输出/完成的情况。在这种情况下,我再次不会在创建子线程的代码块中完成/结束/重新加入子线程。在这种情况下,我将如何遵循结构化并发?

4

1 回答 1

1

“在同一个代码块内”这个短语有点模棱两可。

严格来说,您的main方法可以打开一个 StructuredExecutor 并使其可用于整个程序中的所有代码,这样您就可以使用库对结构化并发的支持,而不是真正使用结构化并发。(这大致类似于使用 for+switch 编写意大利面条代码,技术上不包含 'goto' 但相当于相同的东西。)

您的两个示例都没有遵循结构化并发原则,因为它们涉及分叉任务并放弃它。您可以通过识别真正依赖于该任务的更高级别的调用者并让该更高级别的调用者管理 StructuredExecutor 来重新设计它们以遵循该原则。或者,您可能决定在一般情况下或在这些情况下都不想遵循此原则。

JEP 并没有真正详细解释结构化并发的概念,因为它的主要重点是如何在 Java 中支持它。如果您想了解这个概念本身,我建议您阅读它链接到的一篇或两篇博客文章:

(注意:前者技术性更强,后者更易于阅读。)

于 2022-01-20T01:56:58.863 回答