源码分析 | CompletableFuture 组合处理 allOf 和 anyOf 太赞了!
前段时间写了一篇关于CompletableFuture的异步提交操作以后,一些粉丝问到CompletableFuture其他问题,今儿顺便扒了CompletableFure源码其他的用法和一些函数特性介绍。
allOf 和 anyOf 可以组合任意多个 CompletableFuture。函数接口定义如下所示。
首先,这两个函数都是静态函数,参数是变长的 CompletableFuture 的集合。其次,allOf 和 anyOf 的区别,前者是「与」,后者是「或」。
例 1:allOf
allOf 的返回值是 CompletableFuture<Void>类型,这是因为 每个传入的 CompletableFuture 的返回值都可能不同,所以组合的结果是 无法用某种类型来表示的,索性返回 Void 类型。那么,如何获取每个 CompletableFuture 的执行结果呢?
参看下面的例子:并行地下载 100 个网页。待下载完成之后,统计在 100 个网页中,含有某个单词的网页个数。
这里有个关键问题,因为allof没有返回值,所以通过,给allFutures附上一个回调函数。在回调函数里面,以此调用么一个Future的Get()函数,获取到100个结果,存入List<String>
接下里要做就是统计这100个网页中,含有单词[XXX] 的网页的个数
例 2:anyOf
anyOf 的含义是只要有任意一个 CompletableFuture 结束,就可以做 接下来的事情,而无须像 AllOf 那样,等待所有的 CompletableFuture 结束。
但由于每个 CompletableFuture 的返回值类型都可能不同,任意一个, 意味着无法判断是什么类型,所以 anyOf 的返回值是 CompletableFuture<Object>类型。考虑下面的例子。
在该例子中,因为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且都是成员方法。
🧐分享、点赞、在看,给个3连击呗👇