Java 需要解释时,带嵌套allOf的ApplySync将CompletionStage视为已完成

Java 需要解释时,带嵌套allOf的ApplySync将CompletionStage视为已完成,java,java-8,completable-future,Java,Java 8,Completable Future,在我的应用程序中,我有3个未来的调用,这些调用是并行完成的,当收到其中一个的响应时,我还有另外3个请求,所有这些请求都应该在继续执行代码之前完成,这正是spring提供的延迟结果 过了一会儿,我意识到页面有时会在后3个请求完成之前呈现。原始源代码(为简单起见,采用ommited逻辑): 公共延迟结果someControllerMethod(){ DeferredResult=新的DeferredResult(); CompletableFuture.allOf( 未来1(), 未来2(), 未来

在我的应用程序中,我有3个未来的调用,这些调用是并行完成的,当收到其中一个的响应时,我还有另外3个请求,所有这些请求都应该在继续执行代码之前完成,这正是spring提供的延迟结果

过了一会儿,我意识到页面有时会在后3个请求完成之前呈现。原始源代码(为简单起见,采用ommited逻辑):

公共延迟结果someControllerMethod(){
DeferredResult=新的DeferredResult();
CompletableFuture.allOf(
未来1(),
未来2(),
未来3()
)
.whenComplete((避免,丢弃)->result.setResult(“某物”);
返回结果;
}
公共设施完备的未来3(){
返回someService.asyncCall()
.然后应用同步(响应->{
....
return CompletableFuture.allOf(
未来4(),
未来5(),
未来6()
);
}
);
}

使用
应用程序同步
有时
延迟结果
在实际未来之前完成,而更改为
应用程序同步
似乎可以解决问题。有人能解释一下为什么吗?或者它是我代码中的一个bug,不应该这样做?

然后应用[Async]
接受一个计算结果为任意值的函数。返回值后,未来将使用该值完成。当函数像在代码中一样返回另一个future时,这不会给它增加额外的含义,future将是结果值,无论是否完成,就像任何其他对象一样

事实上,你的

public CompletableFuture<Void> future3() {
    return someService.asyncCall()
        .thenApplyAsync(response -> {
            ....
            return CompletableFuture.allOf(
                future4(),
                future5(),
                future6()
            );
        }
    );
}

然后应用[Async]
接受计算结果为任意值的函数。返回值后,未来将使用该值完成。当函数像在代码中一样返回另一个future时,这不会给它增加额外的含义,future将是结果值,无论是否完成,就像任何其他对象一样

事实上,你的

public CompletableFuture<Void> future3() {
    return someService.asyncCall()
        .thenApplyAsync(response -> {
            ....
            return CompletableFuture.allOf(
                future4(),
                future5(),
                future6()
            );
        }
    );
}

他们认为您使用它的方式是错误的,而您发布的方式甚至会生成指向它的编译器错误。很明显,您的真实代码必须不同。请提供一个。他们认为您使用它的方式是错误的,并且您发布的方式甚至会生成指向它的编译器错误。显然,您的实际代码必须不同。请提供一个.Java文档,这对理解这一点没有帮助,谢谢您的澄清。事实上,我的代码看起来不同,我做了一些快捷方式,但我们可以假设我使用
CompletableFuture
javadoc对理解这一点没有帮助,谢谢澄清。实际上,我的代码看起来不同,我做了一些快捷方式,但我们可以假设我使用了
CompletableFuture
public CompletableFuture<Void> future3() {
    return someService.asyncCall()
        .thenComposeAsync(response -> {
            ....
            return CompletableFuture.allOf(
                future4(),
                future5(),
                future6()
            );
        }
    );
}