java - 嵌套 future 不执行

标签 java multithreading completable-future

我遇到了一个奇怪的情况。我正在摆弄 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/

相关文章:

java - 将旧循环转换为 Java8 循环

java - 将第一个 CompletableFuture 的结果传递给链上的其他 CompletableFuture

java - 如何将 SQLite 表行保存到数组中?

java - 这在数组中如何工作?

java - 您在复杂的构建过程中使用什么?

java - 关于在 Spring 单例范围服务中使用 ThreadLocal 的问题

Java 8 CompletableFuture 惰性计算控制

java - SpringBootTest - 如何在测试级别断言上下文不加载和更改属性?

c# - 多线程单元测试

java - 在非服务器应用程序中嵌入 ServerSockets