第11章 CompletableFuture组合式异步编程
概念:
- 分支/合并框架
- 并行流
- 混聚(mash-up)
区别:
- 并发
- 并行
11.1 Future接口
java5引入,设计初衷:对将来某个时刻会发生的结果进行建模。
使用Futrue:
- 将操作封装到Callable对象中
- 提交给ExecutorService
- ExecutorService.submit返回Future对象
11.1.1 Future接口的局限性
11.1.2 使用CompletableFuture构建异步应用
- CompletableFuture是java8的新特性
- 和Stream的设计遵循了类似的模式:他们都是使用Lambda表达式以及流水线的思想。
Future
CompletableFuture
11.2 实现异步API
CompletableFuture基础用法
11.2.2 错误处理
- complete
- completeExceptionally
public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
public boolean complete(T value) {
boolean triggered = completeValue(value);
postComplete();
return triggered;
}
public boolean completeExceptionally(Throwable ex) {
if (ex == null) throw new NullPointerException();
boolean triggered = internalComplete(new AltResult(ex));
postComplete();
return triggered;
}
...
}
使用工厂方法supplyAsync创建CompletableFuture
- supplyAsync方法接受一个生产者(Supplier)作为参数,返回一个CompletableFuture对象,
- 生产者方法交由ForkJoinPool池中的某个执行线程(Executor)执行。或者重载版本,可以指定生产者方法的执行线程。
public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
return asyncSupplyStage(ASYNC_POOL, supplier);
}
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
Executor executor) {
return asyncSupplyStage(screenExecutor(executor), supplier);
}
...
}
11.3 使用CompletableFuture
- CompletableFuture.supplyAsync
- CompletableFuture.join与get的唯一不同是join不会抛出任何检测到的异常。
- Stream.parallelStream()与CompletableFuture.supplyAsync默认都是使用相同的通用线程池,默认都是使用固定数目的线程。
11.3.4 使用定制的执行器
使用supplyAsync的重载方法,传入Executor参数
- 计算密集型的操作,并且没有I/O,那么推荐使用Stream接口。
- 并行工作单元涉及等待I/O操作(包括网络连接等待),那么使用CompletableFuture灵活性更好。
11.4 对多个异步任务进行流水线操作
- supplyAsync
- thenApply
- thenCompose : 两个异步操作进行流水线,第一个操作完成时,将其结果作为参数传递给第二个操作(在同一线程运行)
- thenComposeAsync : 由不同线程处理
- thenCombine : 两个计算完成后,将结果合并(在同一线程运行)
- thenCombineAsync : 合并操作会提交线程池
11.5 响应CompletableFuture的completion事件
- thenAccept : 操作的返回值做参数
- thenAcceptAsync
- allOf : 所有的CompletableFuture都完成
- anyOf : 任意一个CompletableFuture完成