第11章 CompletableFuture组合式异步编程

第11章 CompletableFuture组合式异步编程

概念:

  • 分支/合并框架
  • 并行流
  • 混聚(mash-up)

区别:

  • 并发
  • 并行

11.1 Future接口

java5引入,设计初衷:对将来某个时刻会发生的结果进行建模。

使用Futrue:

  1. 将操作封装到Callable对象中
  2. 提交给ExecutorService
  3. 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

  1. supplyAsync方法接受一个生产者(Supplier)作为参数,返回一个CompletableFuture对象,
  2. 生产者方法交由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完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值