一 介绍
- 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。
- 它实现了两个接口 Future 和 CompletionStage
- Future
- Future接口定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。
- 只能通过阻塞或者轮询的方式得到任务的结果 调用get()会阻塞
- CompletionStage
- 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段
- Future
它取代了FutureTask , FutureTask实现的是Future和Runnable接口
二 四个核心静态方法
runAsync
public static CompletableFuture
runAsync(Runnable runnable) public static CompletableFuture
runAsync(Runnable runnable,Executor executor) supplyAsync
public static CompletableFuture supplyAsync(Supplier supplier
public static CompletableFuture supplyAsync(Supplier supplier,Executor executor)
说明
没有指定Executor的方法,直接使用默认的ForkJoinPool.commonPool() 作为它的线程池执行异步代码,注意主线程结束后其默认线程池会结束
三 上手
Lambda+Stream+函数式编程
public static List<String> getPriceByASync(List<Mall> list)
{
return list
.stream()
.map(mall -> CompletableFuture.supplyAsync(() ->System.out.println(mall.getPrice())
.collect(Collectors.toList())
.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
}
//异步编排 如多线程爬虫
四 常用方法分类
4.1获得结果和触发计算
get()
- get(long timeout, TimeUnit unit)
- getNow(T valueIfAbsent)
- 立刻获取结果不阻塞,若未完成计算则返回valueIfAbsent
join()
thenApply 计算结果存在依赖关系
-
4.3对计算结果进行消费
thenRun(Runnable runnable)
- 任务 A 执行完执行 B,并且 B 不需要 A 的结果
- thenAccept(Consumer action)
- 任务 A 执行完执行 B,B 需要 A 的结果,但是任务 B 无返回值
thenApply(Function fn)
applyToEither
thenCombine