Nit*_*pta 7 java completable-future
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)
小智 4
在大多数情况下,您不会注意到差异,但如果您希望能够有大量并发异步调用等待某些内容,您将需要使用CompletableFuture.
原因是,如果您只是简单地调用get()常规方法Future,则Thread与其关联的所有资源都会被阻塞,直到调用返回。如果您有很多调用,您的线程池可能会耗尽,或者如果您使用 a,CachedThreadPool您可能会导致创建大量线程。
使用 时CompletableFuture,对象存储在堆上,该堆代表应用程序下一步应该拾取的位置,而不是使用调用堆栈。构建 API 的人在这里进行了讨论。
| 归档时间: |
|
| 查看次数: |
4166 次 |
| 最近记录: |