在所有后代阶段完成之后,是否可以执行操作?

时间:2018-07-06 00:43:28

标签: java completion-stage

CompletionStage.whenComplete()在当前阶段完成之后执行一个动作,但是如果该阶段具有从属阶段,会发生什么呢?当我无法访问所有依赖项时,是否有一种方法可以在所有依赖项阶段完成之后执行操作?

示例:

CompletionStage<Void> parent = ...;
registerCleanup(parent);
CompletionStage<Void> child = parent.thenApply(expensiveOperation);

registerCleanup()仅可访问parent,但它希望注册一个在child执行后将清除的操作。能做到吗?

1 个答案:

答案 0 :(得分:0)

这通常是不可能的,至少对于CompletionStageCompletableFuture API而言是不可能的。

如果您考虑的话,这需要知道

  • 所有依赖项执行完毕后
  • 但此外,将来是否会添加任何新的依赖项

当您查看代码示例时,registerCleanup()怎么知道您将在下一行添加thenApply()依赖项?它怎么知道您不会在2小时内添加另一个依赖关系?

了解这一点的唯一方法是跟踪最初的CompletionStage之前的最新时刻,并且其所有依赖项都将被垃圾回收,之后将无法添加更多依赖项。

这可以通过依靠PhantomReferencesJava 9's new Cleaner API来实现,但是您可能不应该依靠CompletionStage本身来实现,而要依靠它产生的结果–即,我假设,您真正想要清洁的东西。

确实有人可以将对该结果的引用保存在其他地方,这样即使执行了所有相关阶段,您仍然不知道是否可以执行清理。

请注意,仅记录您的API以使用户负责清理工作可能会更简单。