`CompletableFuture.completedFuture ... thenAccept` 相当于顺序处理吗?
is `CompletableFuture.completedFuture ... thenAccept` equivalent to sequential processing?
我正在处理一个包含很多 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
的线程执行。执行 caller
和 callee
的线程自己做所有事情。所以这部分实际上是异步的。因此,该代码 等价于 第二个示例中没有 CompletableFuture
.
的更简单代码
要实际使用 CompletableFuture
,您应该 运行 boolean result = ... // Do something and get result - Step A
异步地通过例如使用 CompletableFuture.supplyAsync
创建这个初始未来。链式代码也将是 运行 异步的。
我正在处理一个包含很多 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
.
初始CompletableFuture
立即完成,下面的代码由直接调用thenAccept
的线程执行。执行 caller
和 callee
的线程自己做所有事情。所以这部分实际上是异步的。因此,该代码 等价于 第二个示例中没有 CompletableFuture
.
要实际使用 CompletableFuture
,您应该 运行 boolean result = ... // Do something and get result - Step A
异步地通过例如使用 CompletableFuture.supplyAsync
创建这个初始未来。链式代码也将是 运行 异步的。