嵌套期货未执行

2023-11-23

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

任何解释(以及如何修复的示例)将不胜感激


这不起作用的原因是,在您的简单测试中,虚拟机在所有任务完成之前退出。

你打电话时completableFutureCompletableFuture.get()只有期货的第一个嵌套才能保证完成。虚拟机退出,所有线程都被终止。

换句话说,第一个嵌套的 future 可能仍然“未完成”,因为它的线程可能仍然很忙。但是,当您尝试使用以下命令获取结果时get它当然会等到它完成并且它会按预期工作。你试一试:

completableFutureCompletableFuture.get().get().get().get().get()

...然后你强制所有 future 完成并且一切都按预期进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套期货未执行 的相关文章

随机推荐