源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!

Posted 极客小智

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!相关的知识,希望对你有一定的参考价值。

导读:本篇继续探讨 CompletableFuture 的特性与使用,详细看一下 CompletableFuture 的用法,对于基础用法不太熟练的同学可查看前几篇CompletableFuture的用法与介绍。


前段时间写了一篇关于CompletableFuture的异步提交操作以后,一些粉丝问到CompletableFuture其他问题,今儿顺便扒了CompletableFure源码其他的用法和一些函数特性介绍。


allOf 和 anyOf 可以组合任意多个 CompletableFuture。函数接口定义如下所示。

源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!

首先,这两个函数都是静态函数,参数是变长的 CompletableFuture 的集合。其次,allOf 和 anyOf 的区别,前者是「与」,后者是「或」。

例 1:allOf

allOf 的返回值是 CompletableFuture<Void>类型,这是因为 每个传入的 CompletableFuture 的返回值都可能不同,所以组合的结果是 无法用某种类型来表示的,索性返回 Void 类型。那么,如何获取每个 CompletableFuture 的执行结果呢?


参看下面的例子:并行地下载 100 个网页。待下载完成之后,统计在 100 个网页中,含有某个单词的网页个数。

源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!

这里有个关键问题,因为allof没有返回值,所以通过,给allFutures附上一个回调函数。在回调函数里面,以此调用么一个Future的Get()函数,获取到100个结果,存入List<String>

源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!

接下里要做就是统计这100个网页中,含有单词[XXX] 的网页的个数

源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!

例 2:anyOf

anyOf 的含义是只要有任意一个 CompletableFuture 结束,就可以做 接下来的事情,而无须像 AllOf 那样,等待所有的 CompletableFuture 结束。


但由于每个 CompletableFuture 的返回值类型都可能不同,任意一个, 意味着无法判断是什么类型,所以 anyOf 的返回值是 CompletableFuture<Object>类型。考虑下面的例子。

源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!

在该例子中,因为future1、future2、future3的返回值都是CompletableFuture<String>,所以anyOf的返回的Object一定也是 String 类型。


并且在 3 个 future 中,future2 睡眠时间最短,会最先执行完成, anyOfFuture.get()获取的也就是 future2 的内容。future1、future3 的 返回结果被丢弃了


回顾整个CompletableFuture的用法主要可概括为以下几点

  •  

  • 组合处理 thenCompose() 与 thenCombine()  、allOf与anyOf()


拓展学习:

到这里大概对CompletableFuture的常用用法有个大致的了解怎么去使用,什么场景用!其实写了这么多案例,不难发现CompletableFuture执行任务一共四种类型

回顾整个CompletableFuture的用法主要可概括为以下几点

  • Runable

  • Customer

  • Supplier

  • Function

runAsync 与 supplierAsync 是 CompletableFutre 的静态方法;

而 thenAccept、thenAsync、thenApply 是 CompletableFutre 的成员方法 因为初始的时候没有 CompletableFuture 对象,也没有参数可传,所以提交的只能是 Runnable 或者 Supplier,只能是静态方法;

通过静态方法生成 CompletableFuture 对象之后,便可以链式地提交其他任务了,这个时候就可以提交 Runnable、Consumer、Function且都是成员方法。

    - END 

    以上是关于源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!的主要内容,如果未能解决你的问题,请参考以下文章

    CompletableFuture: 分析一

    一网打尽:异步神器 CompletableFuture 万字详解!

    CompletableFuture使用详解

    转载- CompletableFuture使用详解

    JUC源码解析CompletableFuture

    CompletableFuture异步编排(多任务组合)