ComputableFuture(Java)与Future接口
首先看一下Java的Future接口:
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
Future接口可以对具体Runnable、Callable任务的执行结果进行取消、查询是 否完成、获取结果等操作。
ComputableFuture是Java8引入的强大的函数式异步编程辅助类。CompletableFuture实现了Future接口。具体接口文档见:docs.oracle.com/javase/8/do…
class CompletableFuture<T> implements Future<T>, CompletionStage<T>
Future接口只有5个方法。CompletableFuture除了支持Future的基本操作外,还支持几十种方法操作。
CompletableFuture类中的join方法和Future接口中的get不同之处在于join方法不会抛出受检异常。
线程池配置
CompletableFuture与parallelStream默认采用的是同样的通用线程池ForkJoinPool.commonPool(),默认都使用定数目的线程,具体线程数取决于Runtime.getRuntime().availableProcessors()的返回值。
CompletableFuture也可以设置指定的线程池。
与ES6 promise的比较
ES6引入的promise特性developer.mozilla.org/zh-CN/docs/…是JavaScript语言中处理异步的工具。CompletableFuture的链式处理与ES6的Promise很相似:
CompletableFuture.completedFuture()类似于Promise.resolve()CompletableFuture.failedFuture()类似于Promise.reject()CompletableFuture.exceptionally()类似于Promise.catch()CompletableFuture.thenApply、thenAccept等方法类似于Promise.then()接收上一个Promise返回的valueCompletableFuture.thenCompose()类似于Promise.then()接收一个上一个Promise返回的PromiseCompletableFuture.allOf类似于Promise.all()CompletableFuture.anyOf类似于Promise.race()
thenApply与thenApplyAsync区别
如果CompletableFuture执行尚未结束, thenApply由完成当前CompletableFuture的线程执行.如果CompletableFuture已经执行结束, thenApply会被调用者线程执行
对于thenApplyAsync,由CompletableFuture的线程池分配线程执行。
对于其他的NoAsync和Async方法也是如此
thenApply()与thenCompose()区别
thenApply()接收一个Function函数式接口。
thenCompose()接收一个CompletionStage。
它们两者的关系有些类似与map()和flatMap()
thenCombine()
public <U,V> CompletionStage<V> thenCombine
(CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn);
需要将两个完全不相干的CompletableFuture对象的结果整合起来,而且不希望等到第一个任务完全结束才开始第二项任务。
thenCombine方法接收名为BiFunction的第二参数,这个参数定义了当两个CompletableFuture对象完成计算后,结果如何合并。