简介
CompletableFuture是java 8提供的用于异步编程的APi。CompletableFuture表示一个未来完成的任务,比如我们new一个线程执行其他操作,这时我们很难判断这个线程什么时候执行完毕。CompletableFuture提供这样的能力。CompletableFuture支持传入回调函数在任务执行完成后执行回调函数。
CompletableFuture类图
CompletableFuture实现了Future和CompletionStage接口,如下图:
Future
Future表示异步计算的结果。提供了检查任务是否完成、等待任务完成以及获取任务结果的方法。
- cancel:尝试取消任务,可能取消失败
- isCancelled:查看任务是否已取消
- isDone:查看任务是否完成
- get:获取任务结果
get有一个重载的方法,不传参数时get会阻塞一直等到任务完成,传入时间参数时,get在等够传入的时间后,如果还没完成会抛出等待超时异常
CompletionStage
CompletionStage是Java 8 新增的接口,表示执行任务的阶段,提供在任务执行阶段中执行某种操作的能力。
CompletionStage接口的方法虽然方法很多但不难发现有规律可循,因为CompletionState定义的方法名以及方法参数大量使用了jdk基本的函数式接口,简单说明几个基本的函数式接口如下:
- Supplier:产出型函数,该函数式接口将返回一个结果,内部定义了一个 T get()方法;
- Consumer:消耗性函数,接受并消费一个参数,内部定义了一个accept(T t)方法;
- Function:即消耗又产出型函数,接受并消费一个参数同时返回一个结果,内部定义了一个R apply(T t)方法;
- BiConsumer:消费性函数,接受并消费两个参数,内部定义了一个void accept(T t, U u)方法;
- BiFunction:即消耗又产出型函数,接受并消费两个参数并返回一个结果,内部定义了一个R apply(T t, U u)方法;
观察CompletionStage接口的方法发现基本都是由then、apply、async、accept、run、combine、both、either、after、compose、when、handle等关键词组合而成,这些关键字可以理解如下:
- then:表示阶段先后顺序,即一个阶段等待另一个阶段完成
- apply:和上面Function一样,表示消费一个参数并提供一个结果
- async:异步标志,即阶段任务的执行相对于当前线程是同步还是异步
- accept:和上面Consumer的accept方法一样,表示消费一个参数
- run:既不消费也不铲除,同Runnable接口含义
- combine:合并两个阶段结果并返回新的阶段
- both:表示二者条件都成立再做其它事
- either:表示二者之一条件成立再做其它事,对应both
- after:表先后顺序,一个任务发生在另一个任务之后,和then相似
- compose:表示根据已有结果生成新的结果,同上面的Function,细看compose的参数和thenApply有区别,具体区别再下面陈述
- when:等同于whenComplete,当前阶段正常完成或异常完成时执行BiConsumer动作
- handle:当前阶段正常完成或异常完成后触发一个BiFunction动作
代码示例
Callable<String> stringCallable = () -> {
System.out.println("Callable aaa");
Thread.sleep(3000);
return "Callable";
};
CompletableFuture<String> completableFuture = new CompletableFuture().toCompletableFuture();
FutureTask<String> futureTask = new FutureTask<>(stringCallable);
new Thread(futureTask).start();
System.out.println("FutureTask");
System.out.println(futureTask.get());