原文链接:https://fxbing.github.io/2019...


CompletableFuture 是Java8 中新增的用来进行函数式异步编程的工具类。

最近学习源码的过程中看到有很多 CompletableFuture 的应用,感觉本人对这个类中的各个办法的应用场景和办法不是很相熟,遂参考了上面几篇博客进行学习(本文大部分内容也都来自上面几篇博客):

Java CompletableFuture 详解

Java8新的异步编程形式 CompletableFuture(一)

Java8新的异步编程形式 CompletableFuture(二)

Java8新的异步编程形式 CompletableFuture(三)

下面的博客介绍的比拟具体,为了本人查阅回看的不便,这里对这些办法进行一下总结(这里只总结不举例,具体应用须要看下面的博客)。

Future接口

Feture 接口蕴含五个办法,介绍如下:

  • boolean cancel (boolean mayInterruptIfRunning) 勾销工作的执行。参数指定是否立刻中断工作执行,或者等等工作完结
  • boolean isCancelled () 工作是否曾经勾销,工作失常实现前将其勾销,则返回 true
  • boolean isDone () 工作是否曾经实现。须要留神的是如果工作失常终止、异样或勾销,都将返回true
  • V get () throws InterruptedException, ExecutionException 期待工作执行完结,而后取得V类型的后果。InterruptedException 线程被中断异样, ExecutionException工作执行异样,如果工作被勾销,还会抛出CancellationException
  • V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同下面的get性能一样,多了设置超时工夫。参数timeout指定超时工夫,uint指定工夫的单位,在枚举类TimeUnit中有相干的定义。如果计 算超时,将抛出TimeoutException

被动实现计算

CompletableFuture实现了CompletionStageFuture两个接口。

通过阻塞或者轮询取得后果

办法名形容
public T get()Future接口实现
public T get(long timeout, TimeUnit unit)Future接口实现
public T getNow(T valueIfAbsent)如果后果曾经计算完则返回后果或者抛出异样,否则返回给定的valueIfAbsent值。
public T join()返回计算的后果或者抛出一个unchecked异样(CompletionException)
join()get()的区别是,join()只会抛出未查看异样(不须要应用try...catch..进行解决),而get()会抛出查看异样

异步获取后果

  • 上面两个函数的调用会立刻执行,并且只能执行一次。
  • 如果该工作曾经执行实现,那么上面两个调用会有效,只能获取执行实现的后果。其实就是使工作立刻完结(返回指定后果或者指定抛出异样)。
  • 比拟适宜须要返回CompletableFuture的办法,先创立一个空的CompletableFuture,之后通过上面两个函数指定后面创立的CompletableFuture的返回值。
办法名形容
complete(T t)实现异步执行,并返回future的后果
completeExceptionally(Throwable ex)异步执行不失常的完结

动态工厂办法

run 和 supply 的次要区别是异步操作是否有返回值(上面列出的所有办法也根本都是依照是否有返回值分为两类)。
办法名形容
runAsync(Runnable runnable)应用ForkJoinPool.commonPool()作为它的线程池执行异步代码。
runAsync(Runnable runnable, Executor executor)应用指定的thread pool执行异步代码。
supplyAsync(Supplier<U> supplier)应用ForkJoinPool.commonPool()作为它的线程池执行异步代码,异步操作有返回值。
supplyAsync(Supplier<U> supplier, Executor executor)应用指定的thread pool执行异步代码,异步操作有返回值。

上面简直所有的办法都是一式三份,三种办法的区别是

  • 间接在以后线程执行
  • 换另一个线程(然而不指定线程)异步执行
  • 指定线程执行

转换

相当于 map 操作
办法名形容
thenApply(Function<? super T,? extends U> fn)承受一个Function<? super T,? extends U>参数用来转换CompletableFuture
thenApplyAsync(Function<? super T,? extends U> fn)承受一个Function<? super T,? extends U>参数用来转换CompletableFuture,应用ForkJoinPool
thenApplyAsync(Function<? super T,? extends U> fn, Executor executor)承受一个Function<? super T,? extends U>参数用来转换CompletableFuture,应用指定的线程池
相当于 flatMap 操作
办法名形容
thenCompose(Function<? super T, ? extends CompletionStage<U>> fn)在异步操作实现的时候对异步操作的后果进行一些操作,并且依然返回CompletableFuture类型。
thenComposeAsync(Function<? super T, ? extends CompletionStage<U>> fn)在异步操作实现的时候对异步操作的后果进行一些操作,并且依然返回CompletableFuture类型。应用ForkJoinPool。
thenComposeAsync(Function<? super T, ? extends CompletionStage<U>> fn,Executor executor)在异步操作实现的时候对异步操作的后果进行一些操作,并且依然返回CompletableFuture类型。应用指定的线程池。

组合

办法名形容
thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn)当两个CompletableFuture都失常实现后,执行提供的fn,用它来组合另外一个CompletableFuture的后果。
thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn)当两个CompletableFuture都失常实现后,执行提供的fn,用它来组合另外一个CompletableFuture的后果。应用ForkJoinPool。
thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn, Executor executor)当两个CompletableFuture都失常实现后,执行提供的fn,用它来组合另外一个CompletableFuture的后果。应用指定的线程池。
thenAcceptBoth跟thenCombine相似,然而返回CompletableFuture类型。
办法名形容
thenAcceptBoth(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> action)当两个CompletableFuture都失常实现后,执行提供的action,用它来组合另外一个CompletableFuture的后果。
thenAcceptBothAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> action)当两个CompletableFuture都失常实现后,执行提供的action,用它来组合另外一个CompletableFuture的后果。应用ForkJoinPool。
thenAcceptBothAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> action, Executor executor)当两个CompletableFuture都失常实现后,执行提供的action,用它来组合另外一个CompletableFuture的后果。应用指定的线程池。

计算结果实现时的解决

  • Action的类型是BiConsumer<? super T,? super Throwable>,它能够解决失常的计算结果,或者异常情况。
  • 办法不以Async结尾,意味着Action应用雷同的线程执行,而Async可能会应用其它的线程去执行(如果应用雷同的线程池,也可能会被同一个线程选中执行
办法名形容
whenComplete(BiConsumer<? super T,? super Throwable> action)当CompletableFuture实现计算结果时对后果进行解决,或者当CompletableFuture产生异样的时候对异样进行解决。
whenCompleteAsync(BiConsumer<? super T,? super Throwable> action)当CompletableFuture实现计算结果时对后果进行解决,或者当CompletableFuture产生异样的时候对异样进行解决。应用ForkJoinPool。
whenCompleteAsync(BiConsumer<? super T,? super Throwable> action, Executor executor)当CompletableFuture实现计算结果时对后果进行解决,或者当CompletableFuture产生异样的时候对异样进行解决。应用指定的线程池。

handle()相当于whenComplete()+转换。

handle()也能够了解为和thenApply()的含意更为类似,然而比thenApply()减少异样解决的性能。

办法名形容
handle(BiFunction<? super T, Throwable, ? extends U> fn)当CompletableFuture实现计算结果或者抛出异样的时候,执行提供的fn
handleAsync(BiFunction<? super T, Throwable, ? extends U> fn)当CompletableFuture实现计算结果或者抛出异样的时候,执行提供的fn,应用ForkJoinPool。
handleAsync(BiFunction<? super T, Throwable, ? extends U> fn, Executor executor)当CompletableFuture实现计算结果或者抛出异样的时候,执行提供的fn,应用指定的线程池。
办法名形容
exceptionally(Function fn)只有当CompletableFuture抛出异样的时候,才会触发这个exceptionally的计算,调用function计算值。

纯生产

办法名形容
thenAccept(Consumer<? super T> action)当CompletableFuture实现计算结果,只对后果执行Action,而不返回新的计算值
thenAcceptAsync(Consumer<? super T> action)当CompletableFuture实现计算结果,只对后果执行Action,而不返回新的计算值,应用ForkJoinPool。
thenAcceptAsync(Consumer<? super T> action, Executor executor)当CompletableFuture实现计算结果,只对后果执行Action,而不返回新的计算值

Either

Either 示意的是两个CompletableFuture,当其中任意一个CompletableFuture计算实现的时候就会执行。
办法名形容
acceptEither(CompletionStage<? extends T> other, Consumer<? super T> action)当任意一个CompletableFuture实现的时候,action这个消费者就会被执行。
acceptEitherAsync(CompletionStage<? extends T> other, Consumer<? super T> action)当任意一个CompletableFuture实现的时候,action这个消费者就会被执行。应用ForkJoinPool
acceptEitherAsync(CompletionStage<? extends T> other, Consumer<? super T> action, Executor executor)当任意一个CompletableFuture实现的时候,action这个消费者就会被执行。应用指定的线程池
applyToEither()acceptEither()的哥哥. 当两个future其中一个实现后,后者用于只是简略地调用一些代码,applyToEither()会返回一个新的future. 这个future是在后面两个future其中一个实现后进行执行实现。
办法名形容
applyToEither(CompletionStage<? extends T> other, Function<? super T,U> fn)当任意一个CompletableFuture实现的时候,fn会被执行,它的返回值会当作新的CompletableFuture<U>的计算结果。
applyToEitherAsync(CompletionStage<? extends T> other, Function<? super T,U> fn)当任意一个CompletableFuture实现的时候,fn会被执行,它的返回值会当作新的CompletableFuture<U>的计算结果。应用ForkJoinPool
applyToEitherAsync(CompletionStage<? extends T> other, Function<? super T,U> fn, Executor executor)当任意一个CompletableFuture实现的时候,fn会被执行,它的返回值会当作新的CompletableFuture<U>的计算结果。应用指定的线程池

其余办法

办法名形容
allOf(CompletableFuture<?>... cfs)在所有Future对象实现后完结,并返回一个future。
anyOf(CompletableFuture<?>... cfs)在任何一个Future对象完结后完结,并返回一个future。