allOf 和 anyOf 可以组合任意多个 CompletableFuture。函数接口定义如下所示。
首先,这两个函数都是静态函数,参数是变长的 CompletableFuture 的集合。其次,allOf 和 anyOf 的区别,前者是「与」,后者是「或」。
例 1:allOf
allOf 的返回值是 CompletableFuture<Void>类型,这是因为 每个传入的 CompletableFuture 的返回值都可能不同,所以组合的结果是 无法用某种类型来表示的,索性返回 Void 类型。那么,如何获取每个 CompletableFuture 的执行结果呢?
参看下面的例子: 并行地下载 100 个网页。待下载完成之后,统计在 100 个网页中,含有某个单词的网页个数。
这里有个关键问题,因为allof没有返回值,所以通过theApply,给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的用法主要可概括为以下几点
简单用法 get() 与 complete() 提交任务 runAsync() 与 supplyAsync()链式处理 theRun()、thenAccept() 和 thenApply()组合处理 thenCompose() 与 thenCombine() 、allOf与anyOf()
举报/反馈

码农架构

151获赞 87粉丝
专注于系统架构类技术分享
关注
0
0
收藏
分享