当拿到CompletableFuture的时候,是真的不知道该怎么去讲算作能够讲清楚,个人觉得COmpletableFuture自己通过部分的内部类+执行器+线程池+函数式,就维护了一个庞大的执行系统,那么这个庞大的系统能够异步的帮助我们很好的优化我们的程序执行效率
CompletableFuture:
CompletableFuture实现了两个接口,CompletableStage、Future,所依其功能就是能够异步执行的线程中间态,这其中的每个中间态都可以相互串联起来,达到最后完成一个任务的作用
Future之前有简单讲过,可以代表的是一种异步执行;而CompletableStage是一种中间状态,返回的就是它自己,这样一来就可以将很多个中间状态串联起来,或者并行执行,得到最终结果,并提升效率
-
创建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), - 通过new
那么问题来了:为什么这里又是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