`CompletableFuture.completedFuture ... thenAccept` 等价于顺序处理吗?

问题描述

我正在处理一个包含大量 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 创建这个初始未来。链式代码也将异步运行。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...