编程语言
首页 > 编程语言> > java-嵌套的期货不执行

java-嵌套的期货不执行

作者:互联网

我遇到了一个奇怪的情况.我不喜欢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();
}

不会抛出异常(即使在异常使用时也是如此),并且我看到的是控制台输出为

first
second
third // appears sometimes

现在,很明显,此代码没有实际的生产价值,但这是一种情况的表示,其中您的代码具有未知数量的嵌套,其中每个嵌套或其中的一些嵌套创建了不会执行的CompleteableFutures.

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

解决方法:

之所以不起作用,是因为在您的简单测试中,VM在所有任务完成之前就退出了.

当您调用completableFutureCompletableFuture.get()时,只能保证期货的第一个嵌套已经完成. VM退出,所有线程被杀死.

换句话说,第一个嵌套的将来可能仍然“未完成”,因为它的线程可能仍然很忙.但是,当您尝试使用get来获取其结果时,它当然会等到它完成后才能正常工作.你试一试:

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

…然后您强迫所有期货都已完成,并且一切都按预期进行.

标签:completable-future,java,multithreading
来源: https://codeday.me/bug/20191011/1889464.html