00:00
接下来你再来说一下多任务组合,这个呢在我们后来的开发场景中用的也非常多,比如我们第一个comutable future有一个方法叫all of,那它还是一个静态方法,那all of的作用就是将所有的我们compible future组合起来,放在这儿,如果他们全部都做完事儿了,那才算完,那对应的还有any of any of呢,就是我们这些comp future,只要有一个人做完事儿,那就算完,我们来测试一下,这个特别呢,对于我们这个查询场景,比如我们把以前的这个去掉,来模拟我们要查询商品信息,那么这个模拟商品信息呢,商品信息有非常多想要查的,所以我们现在先来整一个,比如comp future,点一个我们使用supply anthynic,我们这有带返回值的,首先我们来做第一个,我们呢,比如打印,我们第一个呢,就是来查询。
01:01
当品的图片信息,图片信息,这个图片信息查完了以后呢,我们就给它返回一个,比如我们这个图片地址。Hello点,比如我们就叫JPG,好,那随便返回一个这个,这是我们的第一个complete future,好,FUTURE01,我们就叫它,然后呢,接下来我们还有第二个,第三个。我们来都来组合上,我们把这个零一之前有,我把这个可以来注掉,行了,我们就叫future。我们就叫image,这是来查询图片的,然后呢,我们可能还会查询非常多CTRLC走,然后呢,我们继续,比如我们来查商品的属性,属性比如呢我们就是这一块,就叫黑色256G,比如我们就叫黑色加256G,然后呢,我们这儿还有一个商品的介绍。比如介绍。
02:01
我们呢就叫华为,好,我们就来打印一个华为,那现在呢,查到商品的几种信息,这是at tr,比如呢,这是介绍describe,那么一般呢,都是我们商品的所有异步全部查成功以后,我们商品详情页的内容才算完了,所以呢,我们想要等待他们全部成功。第一种方式我们可以这样,Future image.get先等第一个成,然后呢再等第二个成,然后呢再等第三个乘。好,我把这个拿过来点一个get,当然我们是这种方式呢,其实是有问题的,假设第一个需要执行了两秒,那么在调用第一个的get方法的时候,它其实呢,就必须两秒以后才能调下边的get,然后我们调第二个get的时候,那如果它需要执行三秒,那像我们已经过两秒了,掉第二个get已经过两秒了,那相当于一秒以后,那这个呢才能得到结果。
03:04
那我们来调第三个get的时候,第3GET假设呢,我们就只需要一秒执行,但是呢,我们想要获取第三个get数据,那也是我们这个三秒以后我们才调的这个get方法,虽然说我们这种方式可以使用啊,这种方式呢,阻塞是等待太麻烦了,如果我们查询方法特别多,我们每个都在这组测试等待,虽然最终我们等待的时间一定是我们哪一个方法最长占用的这个时间,但是我们每次这么来写,就会有非常多的这些冗余代码,那么就可以处理一种,我们使用compliable future,它有一个功能叫o of all of呢就是所有的事都做完,比如第一个好,我们来组合多个。Future,好,我们拿过来第一个,第二个以及第三个,然后呢,只要这三个都做完了,我们才算成功,那怎么就只都做完它呢,也会返回一个comfortable future,那都做完呢,有一个叫点一个get,我们可以使用get方式等待它们三个都做完,当然也可以使用我们以前的点一个join方式,好把我们这个线程呢插入进来,等待他们的这些异步查询都来做完。
04:19
那么呢,就可以来直接来使用get,好,那在这来等待所有。结果完成,我们可以来测试一下效果来启动。好,我们发现呢,我们打印慢end的时候,那么这一块呢,就会等待我们这三个全部做完,我们这块呢才有打印,但如果我们不调用这个get方法。我们来看一下效果,我来启动。这一块呢,虽然有打印,呃,这是由于我们之前运行的问题,好,我们把我们之前的这一块呢,我们来都来注掉,走全部呢,我们来都来注掉,我们现在就来等待这个方法,这是man start,那下边呢,这是man end。
05:01
来看all of什么时候执行完走。这块呢,执行的很快。Start end,那么这三个异步呢,都执行完了,但实际上如果有一个人比较慢的话,那么这个打印呢,效果就比较明显了,比如他是三秒。我们把这个异常呢,先surround with次try catch一下,那现在来测试一下效果走,那这块的打印呢,我们就给它放到我们睡了之后,哎,我们拟模拟呢,业务超长,好,我们现在来启动一下。哎,我们发现那么这个商品查询那这一块呢,居然没有商品介绍的信息了。那没有的,原因就是我们这个主线程执行太快了,我们这一块所有任务都没执行完就结束了,但如果是我们以前把这些任务呢,都提交给我们自己的线程池,因为线程池呢一直存在,所以我们这个方法呢,现在是一个无限期存活的阻塞的。好,我们把这个呢放在这儿来看一下改为线程池的结果,好,我们看到这个商品介绍是在慢end之后打印的,所以如果我们想要在这来将三个所有的信息都来使用,那是有问题的,所以呢,我们必须调用这个get方法阻塞,等这三个人全部都做完来看一下效果。
06:19
我们再来结束我们的任务。好,我们发现呢,第三个完我们这个任务呢,就整个结束了,包括我们结束了以后,那还想获取每一个的内容,比如第一个反馈的内容,第二个的内容,那么接下来跟以前一样,把第一个的拿来调一下它的get,那就是第一个的内容,把第二个拿来调一下它的get,比如我们的future at tr调一下他的get,这是第二个内容,把第三个拿来调一下他的get,这就是第三个内容来点一个get。好,我们来运行,看一下最终的效果。那么最终等待所有方法都执行成功以后,那在这呢就能打印我们所有的返回结果了,这是我们说的o of,那接下来同样的就有一个东西叫any of,好,我们先把o of呢来注释在这,我们来再用一个any of any of呢就相当于这三个只要有一个执行成就算好,那这个呢,我们变为any of,来看一下any of的这个条件,这个条件呢,它返回的就不是空了。
07:28
我们来在这儿来看一下,把这个返回值,我们让它自动来返回。走它呢,返回的就是一个object对象,因为我们这个any of只要有一个成功,所以我们这个any of get的就是成功的那个数据,而其他人呢,也不用get了,其他人这个get呢,我们只要有一个成功就算数,其他人这个也get不了,我们把这一块呢去掉啊注掉,那现在呢,想要获取最终的结果到底是哪个成了,那就any of de get一下。
08:02
我们来看一下最终的效果。走。好,我们发现呢,虽然异步任务这一块呢,大家都运行了,因为我们是提交给线程池执行的,线程池一定会把这些执行完,但我们发现只要any of,就是只要有一个人执行成功,发现这个hello JPG成功了,所以我们最终拿到的是hello JPG的数据,那至此呢,这一块就是我们整个comp future,我们简单快速的来过一遍,当然它里边更多的详细方法,他们的这个架构组织方式都是一样的,大家就来参照它的这个入参能传什么,包括它的返回值能传什么,来参照使用就行了,包括我们会用到哪个方法,我们再来编写相应的功能。大家在下边呢,把这一块呢,可以练习一下。
我来说两句