Java 8 CompletableFuture

1,563 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

CompletableFuture是java 8提供的用于异步编程的APi。CompletableFuture表示一个未来完成的任务,比如我们new一个线程执行其他操作,这时我们很难判断这个线程什么时候执行完毕。CompletableFuture提供这样的能力。CompletableFuture支持传入回调函数在任务执行完成后执行回调函数。

介绍

CompletableFuture实现了FutureCompletionStage接口,如下图: image.png CompletableFuture类图如下: image.png

Future

Future表示异步计算的结果。提供了检查任务是否完成、等待任务完成以及获取任务结果的方法。Future的定义如下: image.png

Future提供的方法如下:

image.png

  • cancel:尝试取消任务,可能取消失败 image.png
  • isCancelled:查看任务是否已取消 image.png
  • isDone:查看任务是否完成 image.png
  • get:获取任务结果 get有一个重载的方法,不传参数时get会阻塞一直等到任务完成,传入时间参数时,get在等够传入的时间后,如果还没完成会抛出等待超时异常 image.png

CompletionStage

CompletionStage是Java 8 新增的接口,表示执行任务的阶段,提供在任务执行阶段中执行某种操作的能力。CompletionStage提供的方式如下: image.png CompletionStage中方法接受的参数都是函数式接口,从命名规则可分为以下几种:

  • then开头: 表示任务完成后执行参数(函数式接口
  • run开头: 表示任务运行前后的阶段,执行参数(函数式接口
  • apply开头: 表示和其他任务关联执行后,执行参数(函数式接口
  • whenComplete开头: 表示任务完成或出现异常后执行操作,执行参数(函数式接口
  • handle开头: 表示任务完成或出现异常后执行操作,执行参数(函数式接口
  • Async结尾:表示异步执行参数(函数式接口

CompletionStage中方法会返回一个新的CompletionStage

使用示例

创建异步任务

  1. 无返回值 image.png 2,有返回值 image.png

  2. 当前任务执行完成后,将执行结果传给参数(函数式接口)执行 image.png

  3. 当前任务异步执行完成后,将执行结果传给参数(函数式接口)同步执行 image.png

  4. 两个异步任务并行执行,都执行完后执行某种操作 image.png

  5. 两个异步任务并行执行,有一个执行完后执行某种操作 image.png

  6. 两个异步任务并行执行,谁先执行完就用谁的结果执行某种操作 image.png

  7. 任务执行完成或出现异常后,使用完成结果或异常执行某种操作不会捕获异常 image.png image.png

8,任务执行完成或出现异常后,使用完成结果或异常执行某种操作会捕获异常 image.png