Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套期货不执行_Java_Multithreading_Completable Future - Fatal编程技术网

Java 嵌套期货不执行

Java 嵌套期货不执行,java,multithreading,completable-future,Java,Multithreading,Completable Future,我遇到了一个奇怪的情况。我正在摆弄CompletableFuture,当运行以下代码时,我得到了意想不到的结果: public static void main(String[] args) { CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<Object>>>

我遇到了一个奇怪的情况。我正在摆弄
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();
}
现在,很明显,这段代码没有实际的生产价值,但这是一种情况的表示,在这种情况下,您的代码具有未知数量的嵌套,其中每个或部分嵌套都创建了不会执行的
completablefutures


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

刚刚测试了这一点,它就起作用了。我认为不适用于您的原因是因为您在主方法中运行,并且没有等待完成。我在你的代码之后做了一个
线程。sleep(1000)
,它工作了。最好的方法是wai终止:
completableFutureCompletableFuture.get().get().get().get().get()

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

调用
completablefuture completablefuture.get()
时,只能保证已完成期货的第一次嵌套。VM退出,所有线程都被终止

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

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

。。。然后,您强制所有的未来都已完成,并且一切都按预期工作。

之所以发生这种情况,是因为您的CompletableFuture是异步执行的,但您的程序在第五次调用发生之前终止(我假设您在一个main中运行它,并在创建未来之后返回)

因为您可能不知道在您的未来中有多少未来(由于类型擦除)。您可能需要执行递归.get()

见:


@GuyGrin get只会等待第一个任务完成。你可能不希望有这样的嵌套未来。你应该看看。
completableFutureCompletableFuture.get().get().get().get().get()
public static void main(String[] args) throws InterruptedException, ExecutionException {

    CompletableFuture<?> futures = getFutures();
    recursiveGet(futures);
    System.out.println("finished");

}

public static CompletableFuture<?> getFutures() {
    CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<Object>>>>>> compositeCompletable = 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);
                    });
                });
            });
        });
    });
    return compositeCompletable;
}

public static void recursiveGet(Future<?> future) throws InterruptedException, ExecutionException{
    Object result = future.get();
    if(result instanceof Future){
        recursiveGet((Future<?>) result);
    }
}
first
second
third
fourth
fifth
finished