繁体   English   中英

使用CompletableFuture回调对性能有好处吗?

[英]Is there a performance benefit of using CompletableFuture callbacks?

CompletableFuture允许为异步调用提供回调。 您可以创建一长串回调,其中每个异步调用都会在完成时触发下一个回调。 这被认为是编写异步代码的一种更好的方法,而不是使用Future,因为您在触发下一个之前,必须阻塞线程以获取第一次计算的结果。

我可以理解以下观点,即Completable Futures中的回调链可以提供更具可读性的代码,但是我想知道这种方法是否还具有性能优势,还是仅是语法糖?

例如,考虑以下代码:

    ExecutorService exec = Executors.newSingleThreadExecutor();
    CompletableFuture.supplyAsync(this::findAccountNumber, exec)
                     .thenApply(this::calculateBalance)
                     .thenApply(this::notifyBalance)
                     .thenAccept((i)->notifyByEmail())
                     .join();

在这段代码中,在findAccountNumber()完成之前, calculateBalance()无法启动,因此从本质上来说, calculateBalance()findAccountNumber()上被阻塞,依此类推,对于回调链中的下一方法。 它比以下(性能方面)如何更好:

    ExecutorService exec = Executors.newSingleThreadExecutor();
    Future<Integer> accountNumberFuture = exec.submit(findAccountNumberCallable);
    Integer accountNumber = accountNumberFuture.get();
    Future<String> calculateBalanceFuture = exec.submit(calculateBalanceCallable(accountNumber);
    ....
    ....

在大多数情况下,您不会注意到有什么不同,但是如果您希望能够有很多并发的异步调用等待某事,则可以使用CompletableFuture

原因是,如果您仅在常规Future上调用get() ,则Thread及其所有相关资源将被阻塞,直到调用返回。 如果有许多调用,则线程池可能会用尽,或者如果使用CachedThreadPool ,则可能会导致创建许多线程。

使用CompletableFuture ,对象将存储在堆上,该对象表示应用程序接下来应从何处开始,而不是使用调用堆栈。 构建API的人在这里进行了讨论。

暂无
暂无

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

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