CompletableFuture使用指北

当拿到CompletableFuture的时候,是真的不知道该怎么去讲算作能够讲清楚,个人觉得COmpletableFuture自己通过部分的内部类+执行器+线程池+函数式,就维护了一个庞大的执行系统,那么这个庞大的系统能够异步的帮助我们很好的优化我们的程序执行效率

CompletableFuture:

CompletableFuture实现了两个接口,CompletableStage、Future,所依其功能就是能够异步执行的线程中间态,这其中的每个中间态都可以相互串联起来,达到最后完成一个任务的作用

Future之前有简单讲过,可以代表的是一种异步执行;而CompletableStage是一种中间状态,返回的就是它自己,这样一来就可以将很多个中间状态串联起来,或者并行执行,得到最终结果,并提升效率

  1. 创建CompletableFuture对象
    创建有三种方式

    • 通过new
      CompletableFuture d = new CompletableFuture();
    • 通过静态辅助方法
      用来返回一个已经计算好的值(计算好的值,是通过参数传入),相当于是一个同步的方法,其实底层就是调用了new CompletableFuture(U u)
    public static <U> CompletableFuture<U> completedFuture(U value)
    
    
    public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);
    
     public static CompletableFuture<Void> runAsync(Runnable runnable);
    

    传入一个Supplier类型(格式如下:()-> reture U),最后返回一个值为U的CompletabeFuture,
    其实底层是通过Executor的execute(Runnable runnable),

那么问题来了:为什么这里又是Runnable呢?不是说好的会有返回值嘛,怎么不是Callable?

首先我们来看一下类图
在这里插入图片描述

值得关注的是
一般执行CompletableFuture,不论是创建的(除了直接new以外),还是中间操作都有三个重载方法,其中一个同步执行方法,两个异步执行方法,两个异步执行方法中有一个会指定Executor,那如果指定了Executor的话,那么就会用指定的线程池操作,否则就是用默认的ForkJoinPool中的线程来执行。代码如下

public CompletableFuture<T> 	supplyAsync(Supplier<U> supplier)
public CompletableFuture<T> 	supplyAsync(Supplier<U> supplier)
public CompletableFuture<T> 	supplyAsync(Supplier<U> supplier, Executor executor)

在后面所有的代码摘取中一般只摘取其中一个来讲解

为什么是runnable?
我们来看这么一条代码:

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
   
      return asyncSupplyStage(asyncPool, supplier);
  }
  
static <U> CompletableFuture<U
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值