【问题标题】:Is there a way to execute an action after all descendant stages complete?有没有办法在所有后代阶段完成后执行一个动作?
【发布时间】:2018-07-06 00:43:27
【问题描述】:

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

例子:

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

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

【问题讨论】:

    标签: java completion-stage


    【解决方案1】:

    这通常是不可能的,至少在 CompletionStageCompletableFuture API 中是不可能的。

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

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

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

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

    这可以通过依赖PhantomReferencesJava 9's new Cleaner API 来实现,但您可能不应该在CompletionStage 本身上执行此操作,而是根据它产生的结果——我想,这就是您真正想要的清洁。

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2018-06-20
      • 2014-03-16
      相关资源
      最近更新 更多