CompletableFuture 异步编程

2021/01/08 posted in  并发工具

异步化是并发实施的的基础吗,,利用多线程优化性能这个核心方案得以实施的基础,Java 在 1.8 版本提供了 CompletableFuture 来支持异步编程,CompletableFuture 有可能是你见过的最复杂的工具类

CompletableFuture 创建


//使用默认线程池
// runnable 的run方法没有返回值
static CompletableFuture<Void> 
  runAsync(Runnable runnable)
// supplier 的 get() 方法是有返回值的
static <U> CompletableFuture<U> 
  supplyAsync(Supplier<U> supplier)
//可以指定线程池  
static CompletableFuture<Void> 
  runAsync(Runnable runnable, Executor executor)
static <U> CompletableFuture<U> 
  supplyAsync(Supplier<U> supplier, Executor executor)  

创建完 CompletableFuture 对象之后,会自动的执行runnable 的run方法或者是 supplier.get() 方法, 需要关注的是执行什么时候结束,以及操作的结果获取,它实现了Futura接口可以通过这些解决

CompletionStage 接口

任务是有时序关系的比如串行关系,并行关系,汇聚关系等

串行关系

CompletionStage描述的串行关系,主要有thenApply,thenAccept,thenRun,thenCompse四个系列接口

  1. thenApply 系列函数里参数 fn 的类型是接口 Function<T,R>,这个接口里与 CompletionStage 相关的方法是 R apply(T t),这个方法既能接收参数也支持返回值,所以 thenApply 系列方法返回的是CompletionStage
  2. thenAccept 系列函数中参数 consumer 的类型接口是Consumer,这个接口里与 CompletionStage 相关的方法是 void accept(T t),这个方法支持传入参数但是不支持返回值,所以 thenAccept 系列方法返回的是CompletionStage
  3. thenRun 系列函数中的参数 action 的参数是 Runnable,所以 action 既不能接收参数也不支持返回值,所以 thenRun 系列方法返回的也是CompletionStage
  4. 这个系列的方法会新创建出一个子流程,最终结果和 thenApply 系列是相同的

AND 汇聚关系

CompletionStage 接口里面描述 AND 汇聚关系,主要是 thenCombine、thenAcceptBoth 和 runAfterBoth 系列的接口,这些接口的区别也是源自 fn、consumer、action 这三个核心参数不同

OR 汇聚关系

CompletionStage 接口里面描述 OR 汇聚关系,主要是 applyToEither、acceptEither 和 runAfterEither 系列的接口,这些接口的区别也是源自 fn、consumer、action 这三个核心参数不同

异常处理

fn、consumer、action 它们的核心方法都不允许抛出可检查异常,但是却无法限制它们抛出运行时异常


// try{}catch{}中的 catch{}
CompletionStage exceptionally(fn);
//类似于 try{}finally{}中的 finally{} 但是没有返回值
CompletionStage<R> whenComplete(consumer);
CompletionStage<R> whenCompleteAsync(consumer);
//类似于 try{}finally{}中的 finally{} 有返回值
CompletionStage<R> handle(fn);
CompletionStage<R> handleAsync(fn);