【发布时间】:2017-07-09 14:22:28
【问题描述】:
我遇到了一个奇怪的情况。我在摆弄CompletableFuture,当运行以下代码时,我得到了意想不到的结果:
public static void main(String[] args) {
CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<Object>>>>>> completableFutureCompletableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("first");
return CompletableFuture.supplyAsync(() -> {
System.out.println("second");
return CompletableFuture.supplyAsync(() -> {
System.out.println("third");
return CompletableFuture.supplyAsync(() -> {
System.out.println("fourth");
return CompletableFuture.supplyAsync(() -> {
System.out.println("fifth");
return CompletableFuture.completedFuture(null);
});
});
});
});
});
completableFutureCompletableFuture.get();
}
没有抛出异常(即使使用exceptionally),我看到的是控制台输出是
first
second
third // appears sometimes
现在,显然这段代码没有真正的生产价值,但这代表了一种情况,即您的代码具有未知数量的嵌套,其中每个或其中一些嵌套创建 CompleteableFutures 不会被执行。
任何解释(以及如何修复的示例)将不胜感激
【问题讨论】:
-
你可能不希望有这样的嵌套期货。你应该看看
thenCompose[Async]()。
标签: java multithreading completable-future