繁体   English   中英

Java Spring 树结构@async

[英]Java Spring tree structure @async

对于我正在处理的项目,我创建了一个树结构。 树中的每个节点都代表一个“任务”,可以执行并且需要未知的时间。 这些“任务”的示例包括但不限于:运行命令、发出 HTTP 请求或与数据库交互。

由于代码必须尽可能高效地运行,因此可以将这些任务包装在用 @Async 注释的函数中,以便它们可以并行运行。 一旦节点完成运行,所有子节点也将使用相同的 @Async 包装器执行。 这个循环一直持续到整个树完成,要么成功,要么分支失败。

但是,问题是主线程应该等到整个树完成后才能继续。 我曾尝试将所有 CompletableFuture 结果放入一个列表中,然后检查是否所有结果都已完成,但这是有问题的,因为节点必须在触发其子节点之前完成。

我设法将它一起破解的另一种方法是拥有一组节点来跟踪当前正在运行/排队的所有节点。 一旦列表为空,因此所有节点都已完成,线程将调用回调函数,该函数再次触发代码的主分支以继续。 但是,这样做的问题是主分支将继续在“工作”线程之一上执行。 它还利用回调,而理想情况下,调用者函数不会知道正在执行的函数是异步的; 它需要做的就是调用它。

Tldr:如何让主线程等待整个树异步运行完成。

2021 年 9 月 1 日编辑:我可能没有像需要的那样准确地描述问题。 我想澄清一下,我想异步访问树中的每个节点。 我不是在寻找特定的节点,所以这不是搜索问题。

下面我已经包含了如何工作的动画。 所有显示为“工作”的节点都在单独的线程上执行。 只有当每个节点都完成并且整棵树都是绿色的时候,我才希望主线程继续前进。

树访问的动画应该起作用

所以跟进这个,我设法通过以下方式解决它:

我在主线程上启动第一个“根”任务,然后通过等待 CompletableFuture 来锁定线程。 不同的工作线程然后走自己的路。 一旦任务完成,它将在各自的工作线程上触发它的子任务。

同时,堆栈结构用于跟踪当前正在进行的不同任务。 每次任务完成时,它都会将自己从调用堆栈中移除并检查它现在是否为空。 如果它为空,则意味着所有工作线程都已完成,并且 CompletableFuture 被调用,释放线程锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM