小编Nit*_*pta的帖子

使用 CompletableFuture 回调是否有性能优势?

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

我可以理解 Completable Futures 中的回调链可以提供更具可读性的代码的论点,但我想知道这种方法是否也有性能优势,或者它只是一个语法糖?

例如,考虑以下代码:

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

在此代码中,在完成calculateBalance()之前无法启动findAccountNumber(),因此回调链中的下一个方法基本上calculateBalance()被阻塞,依此类推。findAccountNumber()它比以下内容如何更好(性能方面):

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

Run Code Online (Sandbox Code Playgroud)

java completable-future

7
推荐指数
1
解决办法
4166
查看次数

标签 统计

completable-future ×1

java ×1