Java8异步框架之CompletableFuture

1. CompletableFuture

CompletableFuture 是JDK1.8版本新引入的类。主要作用就是进行任务的异步计算,通过函数式接口的方式帮助我们简化了异步计算的复杂性。

适用场景

当你的业务处理中需要对部分处理异步计算,且最终汇总计算结果时,CompletableFuture是你不二的选择。JDK1.5中也提供了Future接口,但是获取结果需要一直让CPU轮询,同时配合线程或者线程池的处理代码相对还是比较复杂的。

2. 创建异步任务
public static CompletableFuture<Void> runAsync(Runnable runnable)
public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
  • CompletableFuture 中提供了四个静态方法来创建任务任务,其中runAsync方法无返回值,supplyAsync有返回值。
  • 方法中Executor参数用来指定执行异步任务的线程池,若不指定则默认使用ForkJoinPool.commonPool() 作为它的线程池执行异步代码。
3. 计算完成回调
public CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action)
public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action)
public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action, Executor executor)

其中:

  • whenComplete 是使用执行当前任务的线程(如main)去执行 whenComplete 中的任务。
  • whenCompleteAsync 则是把后续的任务交给线程池,Executor 同样用来指定线程池。
    回调方法非静态,需要配合上面 CompletableFuture 的对象进行调用。

示例:

public static void main(String[] args) throws Exception {
    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
        System.out.println("1");
        return "1";
    });

    future.whenCompleteAsync((r, tr) -> {
        System.out.println("执行完成!");
    });
}

如上代码是执行异步线程执行print(1)之后再异步执行print(执行完成),可以配合打印线程名称及sleep验证使用情况。

4. 串行化

当存在多个任务且相互依赖时,此时whenComplete回调无法满足需求了,CompletableFuture 提供了如下的方法

public CompletableFuture<Void> thenRun(Runnable var1)
public CompletableFuture<Void> thenAccept(Consumer<? super T> var1)
public <U> CompletableFuture<U> thenApply(Function<? super T, ? extends U> var1)
  • thenRun:单纯的等待上一个任务完成后执行,没有入参,也没有返回值
  • thenAccept:等待上一个任务完成后的结果作为入参执行,没有返回值
  • thenApply:等待上一个任务完成后的结果作为入参执行,有返回值
    如上三个方法中都存在对应的Async方法,这里就不列出来了。
5. 组合处理
public static CompletableFuture<Void> allOf(CompletableFuture<?>... var0)
public static CompletableFuture<Object> anyOf(CompletableFuture<?>... var0)
  • allOf 的含义是所有的 CompletableFuture 完成操作(如join)才可以做接下来的事情。
  • anyOf 的含义是只要有任意一个 CompletableFuture 完成操作,就可以做接下来的事情。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java码农杂谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值