异步化是并发实施的的基础吗,,利用多线程优化性能这个核心方案得以实施的基础,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四个系列接口
- thenApply 系列函数里参数 fn 的类型是接口 Function<T,R>,这个接口里与 CompletionStage 相关的方法是 R apply(T t),这个方法既能接收参数也支持返回值,所以 thenApply 系列方法返回的是CompletionStage
- thenAccept 系列函数中参数 consumer 的类型接口是Consumer
,这个接口里与 CompletionStage 相关的方法是 void accept(T t),这个方法支持传入参数但是不支持返回值,所以 thenAccept 系列方法返回的是CompletionStage - thenRun 系列函数中的参数 action 的参数是 Runnable,所以 action 既不能接收参数也不支持返回值,所以 thenRun 系列方法返回的也是CompletionStage
- 这个系列的方法会新创建出一个子流程,最终结果和 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);
