Java8 CompletableFuture

简介

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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_三石_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值