不涉及使用 '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);
通过将调用链接到 f 和 g,我们得到了有保证的顺序。
h 呢?我们是否得到任何保证 h 将始终在 g 之后执行?
我尝试让 g 进入睡眠状态以对此进行测试,但我总是看到 h 在 g[ 之后执行=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;
});
假设
CompletableFuture<T> cf = CompletableFuture.completedFuture(...);
cf.thenApplyAsync(f)
.thenApplyAsync(g);
cf.thenApplyAsync(h);
通过将调用链接到 f 和 g,我们得到了有保证的顺序。 h 呢?我们是否得到任何保证 h 将始终在 g 之后执行?
我尝试让 g 进入睡眠状态以对此进行测试,但我总是看到 h 在 g[ 之后执行=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;
});