繁体   English   中英

`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 (如包装器 package)来传递数据,而不是作为异步执行代码的工具。 这个工具可以用来在线程之间传递数据,但这不是这段代码所做的。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM