我遇到了一个奇怪的情况。我正在摆弄 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
现在,显然这段代码没有真正的生产值(value),但这是一种情况的表示,其中您的代码具有未知数量的嵌套,其中每个或其中一些创建 CompleteableFutures
不会被执行。
任何解释(以及如何修复的示例)将不胜感激
最佳答案
这不起作用的原因是因为在您的简单测试中,VM 在所有任务完成之前退出。
当您调用 completableFutureCompletableFuture.get()
时,只有第一个 futures 嵌套可以保证完成。 VM 退出,所有线程都被杀死。
换句话说,第一个嵌套的 future 可能仍然是“未完成的”,因为它的线程可能仍然很忙。但是,当您尝试使用 get
获取其结果时,它当然会等到完成并按预期工作。只需尝试:
completableFutureCompletableFuture.get().get().get().get().get()
... 然后你强制所有的 futures 完成并且一切都按预期工作。
关于java - 嵌套 future 不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42342302/