ComputableFuture(Java)和Promise(JavaScript)

2,075 阅读2分钟

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接口可以对具体RunnableCallable任务的执行结果进行取消、查询是 否完成、获取结果等操作。
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方法不会抛出受检异常。

线程池配置

CompletableFutureparallelStream默认采用的是同样的通用线程池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返回的value
  • CompletableFuture.thenCompose()类似于Promise.then()接收一个上一个Promise返回的Promise
  • CompletableFuture.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对象完成计算后,结果如何合并。

参考资料: