CompletionStage.whenComplete()
在当前阶段完成之后执行一个动作,但是如果该阶段具有从属阶段,会发生什么呢?当我无法访问所有依赖项时,是否有一种方法可以在所有依赖项阶段完成之后执行操作?
示例:
CompletionStage<Void> parent = ...;
registerCleanup(parent);
CompletionStage<Void> child = parent.thenApply(expensiveOperation);
registerCleanup()
仅可访问parent
,但它希望注册一个在child
执行后将清除的操作。能做到吗?
答案 0 :(得分:0)
这通常是不可能的,至少对于CompletionStage
或CompletableFuture
API而言是不可能的。
如果您考虑的话,这需要知道
当您查看代码示例时,registerCleanup()
怎么知道您将在下一行添加thenApply()
依赖项?它怎么知道您不会在2小时内添加另一个依赖关系?
了解这一点的唯一方法是跟踪最初的CompletionStage
之前的最新时刻,并且其所有依赖项都将被垃圾回收,之后将无法添加更多依赖项。
这可以通过依靠PhantomReferences
或Java 9's new Cleaner
API来实现,但是您可能不应该依靠CompletionStage
本身来实现,而要依靠它产生的结果–即,我假设,您真正想要清洁的东西。
确实有人可以将对该结果的引用保存在其他地方,这样即使执行了所有相关阶段,您仍然不知道是否可以执行清理。
请注意,仅记录您的API以使用户负责清理工作可能会更简单。