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

aun*_*low 3 java completable-future

我正在开发一个包含很多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
        });
    }
Run Code Online (Sandbox Code Playgroud)

我得出的结论是,步骤 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
    }
Run Code Online (Sandbox Code Playgroud)

aku*_*ykh 5

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

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

调用CompletableFuture.completedFuture什么也不做,只是创建一个新的CompletableFuture,它由您传递给该方法的任何内容完成。然后调用thenAccept它,基本上有以下效果:“完成后取出结果,让计算结果的线程执行下面的代码。如果结果已经计算出来,让调用者自己执行下面的代码。 ” “以下代码”只是您传递给的 lambda thenAccept

初始化CompletableFuture立即完成,下面的代码由直接调用的线程执行thenAcceptcaller自己执行并完成所有事情的线程callee。所以这部分实际上并没有异步执行任何操作。因此,该代码相当于第二个示例中不带 的更简单的代码CompletableFuture

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