Java结构化并发



结构化并发:

一个简单的原则,声明当执行流拆分为多个并发流时,它们会重新加入到同一代码块中。

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

//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不需要等待子线程的输出/完成。在这种情况下,我不会再次在创建子线程的代码块中完成/结束/重新加入子线程。在这种情况下,我将如何遵循结构化并发?

短语"在同一代码块内";有点模棱两可。

严格地说,main方法可以打开一个StructuredExecutor,并使其对整个程序中的所有代码都可用,因此您使用的是对结构化并发的库支持,而不是真正使用结构化并发。(这大致类似于使用for+开关编写意大利面条代码,从技术上讲,这些代码不包含"goto",但相当于相同的内容。(

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

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

  • "结构化并发";,作者:Martin Sústrik,2016-02-07
  • "关于结构化并发的注释,或者:Go语句被认为是有害的";,作者:NathanielJ.Smith,2018-04-25

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

最新更新