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

use*_*045 3 java java-8

假设

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

cf.thenApplyAsync(h);
Run Code Online (Sandbox Code Playgroud)

通过调用fg的调用,我们得到了保证的顺序.什么^ h?我们是否得到任何guarentees ^ h将八方通后执行

我试着把g睡觉以便测试这个,我总是看到hg之后执行,但这不是证据.如果是这样的情况,h总是在g之后执行,我在哪里可以找到关于此的文档?我阅读了CompletionStage,ExecutorService和CompletableFuture文档,但我还没有找到任何信息可以让我得到关于排序的结论,例如在(g.f)的情况下不涉及链接.

Mis*_*sha 6

如果它不在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;
});
Run Code Online (Sandbox Code Playgroud)