0

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

例子:

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

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

4

1 回答 1

0

这在一般情况下是不可能的,至少使用CompletionStageCompletableFutureAPI 是不可能的。

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

  • 当所有依赖项都已执行时
  • 但此外,未来是否会添加任何新的依赖项

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

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

这可以通过依赖PhantomReferencesJava 9 的新CleanerAPI来实现,但您可能不应该在其CompletionStage本身上执行它,而是在它产生的结果上执行 - 我想,这就是您真正想要清理的内容。

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

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

于 2018-08-30T11:11:05.190 回答