gpt4 book ai didi

java - `CompletableFuture.completedFuture ... thenAccept` 相当于顺序处理吗?

转载 作者:行者123 更新时间:2023-12-05 02:03:14 27 4
gpt4 key购买 nike

我正在做一个有很多 CompletableFuture.completedFuture ... thenAccept 代码的项目,例如

    public CompletableFuture<Boolean> callee() {
boolean result = ... // Do something and get result - Step A
return CompletableFuture.completedFuture(Boolean.valueOf(result));
}

public void caller() {
callee().thenAccept(result -> {
// Detect if call success or failure - Step B
new Throwable().printStackTrace(); // the debug code: stacktrace shows it is called from caller
});
}

我得出结论,步骤 A 和步骤 B 在一个线程中顺序调用。

那么我可以这样简化吗?

    public boolean callee() {
boolean result = ... // Do something and get result
return result;
}

public void caller() {
boolean result = callee();
// Detect if call success or failure
}

最佳答案

是的,你可以这样简化它。长版:

我认为问题应该是:“CompletableFuture 的这种用法是否合适?”。不,这不对。此代码使用 CompletableFuture 作为包装器、包来传递数据,而不是作为异步执行代码的工具。此工具可以用于在线程之间传递数据,但这不是这段代码的作用。

调用 CompletableFuture.completedFuture 除了创建一个新的 CompletableFuture 之外什么都不做,无论你传递给方法什么,它都会完成。然后你在上面调用thenAccept,它基本上有以下效果:“完成后取出结果,让已经计算出结果的线程执行下面的代码。如果结果已经计算出来,让调用者自己执行以下代码。” “以下代码”只是您传递给 thenAccept 的 lambda。

初始的 CompletableFuture 立即完成,随后的代码由直接调用 thenAccept 的线程执行。执行 callercallee 的线程自己做所有事情。所以这部分实际上是异步的。因此,该代码等同于第二个示例中没有CompletableFuture 的简单代码。

要实际使用 CompletableFuture,您应该异步运行 boolean result = ...//Do something and get result - Step A 例如使用 CompletableFuture.supplyAsync 创建这个初始 future .链式代码也将异步运行。

关于java - `CompletableFuture.completedFuture ... thenAccept` 相当于顺序处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65377485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com