Java Spring 树结构@async
Java Spring tree structure @async
对于我正在处理的项目,我创建了一个树结构。树中的每个节点都代表一个可以执行并花费未知时间的“任务”。这些“任务”的示例包括但不限于:运行执行命令、发出 HTTP 请求或与数据库交互。
由于代码必须 运行 尽可能高效,因此可以将这些任务包装在一个用 @Async 注释的函数中,这样它们就可以 运行 并行。一旦节点完成 运行ning,所有子节点也将使用相同的 @Async 包装器执行。这个循环一直持续到整个树完成,要么成功要么失败 b运行ches.
但是,问题是主线程应该等到整棵树都完成它的工作后再继续。我已经尝试将所有 CompletableFuture 结果放入一个列表中,然后检查是否所有结果都已完成,但这是有问题的,因为节点必须在触发它的子节点之前完成。
我设法将其整合在一起的另一种方法是拥有一组节点,用于跟踪当前 running/queued 的所有节点。一旦列表为空,因此所有节点都已完成,线程将调用一个回调函数,该回调函数再次触发代码的主要 b运行ch 以继续。但是,这样做的问题是主 b运行ch 将继续在“工作”线程之一上执行。它还使用回调,而理想情况下调用函数不知道正在执行的函数是异步的;它所需要做的就是调用它。
Tldr:如何让主线程等待整个树异步完成 运行ning。
编辑 2021 年 9 月 1 日:
我可能没有尽可能准确地描述问题。我想澄清一下,我想异步访问树中的每个节点。我不是在寻找特定节点,所以这不是搜索问题。
下面我放了一个动画,说明这是如何工作的。所有显示为“正在工作”的节点都在单独的线程上执行。只有当每个节点都完成,并且整个树都是绿色的,我希望主线程继续它的方式。
所以跟进这个,我设法通过以下方式解决它:
我在主线程上启动了第一个“根”任务,之后我通过等待 CompletableFuture 来锁定线程。不同的工作线程然后按照自己的方式进行。任务完成后,它将在各自的工作线程上触发它的子任务。
同时,堆栈结构用于跟踪当前正在进行的不同任务。每次任务完成时,它都会从调用堆栈中删除自己并检查它现在是否为空。如果为空,则意味着所有工作线程都已完成,并调用 CompletableFuture,释放线程锁。
对于我正在处理的项目,我创建了一个树结构。树中的每个节点都代表一个可以执行并花费未知时间的“任务”。这些“任务”的示例包括但不限于:运行执行命令、发出 HTTP 请求或与数据库交互。
由于代码必须 运行 尽可能高效,因此可以将这些任务包装在一个用 @Async 注释的函数中,这样它们就可以 运行 并行。一旦节点完成 运行ning,所有子节点也将使用相同的 @Async 包装器执行。这个循环一直持续到整个树完成,要么成功要么失败 b运行ches.
但是,问题是主线程应该等到整棵树都完成它的工作后再继续。我已经尝试将所有 CompletableFuture 结果放入一个列表中,然后检查是否所有结果都已完成,但这是有问题的,因为节点必须在触发它的子节点之前完成。
我设法将其整合在一起的另一种方法是拥有一组节点,用于跟踪当前 running/queued 的所有节点。一旦列表为空,因此所有节点都已完成,线程将调用一个回调函数,该回调函数再次触发代码的主要 b运行ch 以继续。但是,这样做的问题是主 b运行ch 将继续在“工作”线程之一上执行。它还使用回调,而理想情况下调用函数不知道正在执行的函数是异步的;它所需要做的就是调用它。
Tldr:如何让主线程等待整个树异步完成 运行ning。
编辑 2021 年 9 月 1 日: 我可能没有尽可能准确地描述问题。我想澄清一下,我想异步访问树中的每个节点。我不是在寻找特定节点,所以这不是搜索问题。
下面我放了一个动画,说明这是如何工作的。所有显示为“正在工作”的节点都在单独的线程上执行。只有当每个节点都完成,并且整个树都是绿色的,我希望主线程继续它的方式。
所以跟进这个,我设法通过以下方式解决它:
我在主线程上启动了第一个“根”任务,之后我通过等待 CompletableFuture 来锁定线程。不同的工作线程然后按照自己的方式进行。任务完成后,它将在各自的工作线程上触发它的子任务。
同时,堆栈结构用于跟踪当前正在进行的不同任务。每次任务完成时,它都会从调用堆栈中删除自己并检查它现在是否为空。如果为空,则意味着所有工作线程都已完成,并调用 CompletableFuture,释放线程锁。