Java 是否有办法在所有子代阶段完成后执行操作?

Java 是否有办法在所有子代阶段完成后执行操作?,java,completion-stage,Java,Completion Stage,CompletionStage.whenComplete()在当前阶段完成后执行操作,但是如果该阶段具有依赖阶段,会发生什么情况?当我无法访问依赖项时,是否有方法在所有依赖项阶段完成后执行操作 例如: CompletionStage<Void> parent = ...; registerCleanup(parent); CompletionStage<Void> child = parent.thenApply(expensiveOperation); Complet

CompletionStage.whenComplete()
在当前阶段完成后执行操作,但是如果该阶段具有依赖阶段,会发生什么情况?当我无法访问依赖项时,是否有方法在所有依赖项阶段完成后执行操作

例如:

CompletionStage<Void> parent = ...;
registerCleanup(parent);
CompletionStage<Void> child = parent.thenApply(expensiveOperation);
CompletionStage父级=。。。;
注册清理(父级);
CompletionStage子级=父级。然后应用(expensiveOperation);

registerCleanup()
仅获取对父级的访问权,但它希望注册一个操作,该操作将在执行子级之后进行清理。这可以做到吗?

这在一般情况下是不可能的,至少在
CompletionStage
CompletableFuture
API中是不可能的

如果你考虑它,这就需要知道

  • 当所有依赖项都已执行时
  • 但除此之外,将来是否会添加任何新的依赖项
当您查看代码示例时,
registerCleanup()
如何知道您将在下一行添加一个
thenApply()
依赖项?它怎么知道你不会在2小时内添加另一个依赖项

知道这一点的唯一方法是跟踪初始
CompletionStage
之前的最新时刻,它的所有依赖项都将被垃圾收集,之后将无法添加更多依赖项

这可以通过依赖或来实现,但您可能不应该在
CompletionStage
本身上实现,而应该基于它产生的结果——我想,这就是您真正想要清理的结果

事实上,有人可能已经将对该结果的引用保存到了其他地方,这样即使在执行了所有依赖阶段之后,您仍然不知道是否可以执行清理

请注意,只记录API可能更简单,这样用户就可以进行清理