不涉及使用 'then..' 方法链接时,是否保证 CompletableFuture 顺序?

Is CompletableFuture ordering guaranteed when chaining with 'then..' methods is not involved?

假设

CompletableFuture<T> cf = CompletableFuture.completedFuture(...);
cf.thenApplyAsync(f)
  .thenApplyAsync(g);

cf.thenApplyAsync(h);

通过将调用链接到 fg,我们得到了有保证的顺序。 h 呢?我们是否得到任何保证 h 将始终在 g 之后执行?

我尝试让 g 进入睡眠状态以对此进行测试,但我总是看到 hg[ 之后执行=28=] 但这不是证据。 如果 h 总是在 g 之后执行,我在哪里可以找到有关此的文档?我阅读了 CompletionStage、ExecutorService 和 CompletableFuture 文档,但我还没有真正找到任何信息可以让我在不涉及 (g.f) 的情况下进行链接时得出关于排序的结论。

如果它不在 javadocs 中,则不能保证。在您的情况下,h 可以在 g 之前轻松执行。 f 需要一段时间才能发生这种情况:

cf.thenApplyAsync(i -> {
    try {
        System.out.println("F");
        Thread.sleep(5000);
        return i;
    } catch(InterruptedException e) {
        throw new RuntimeException(e);
    }
}).thenApplyAsync(i -> {
        System.out.println("G");
        return i;
});

cf.thenApplyAsync(i -> {
        System.out.println("H");
        return i;
});