在使用'然后进行链接时,CompletableFuture的订购是否有保证。'方法不涉及?

时间:2015-01-26 19:20:04

标签: java java-8

假设

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

cf.thenApplyAsync(h);

通过将呼叫引导至 f g ,我们可以获得有保证的订购。 那么 h 呢?在 g 之后,我们是否会得到 h 一直执行的任何保证人?

我尝试将 g 置于睡眠状态以便对此进行测试,并且我总是看到 h g 之后执行,但这不是证据。 如果 h 总是在 g 之后执行,我在哪里可以找到有关此内容的文档?我阅读了CompletionStage,ExecutorService和CompletableFuture文档,但我还没有真正找到任何信息可以让我得到关于订购的结论,而在(g。f)的情况下不涉及链接。

1 个答案:

答案 0 :(得分: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;
});