00:00
前面呢,我们说了两任务组合都要完成的情况,比如我们这个a then combine了B,当我们AB都干完以后呢,我们再来执行C,那接来我们再来看一个我们一个完成,我们就来执行C的情况,那我们这个呢,跟我们之前这些方法呢都一样,我们还是到这来看,首先呢,有我们这个run after什么,我们以前呢是boss,现在呢叫either,现在只要两个里边有一个完成就行了,我们还是来分析这个run after either,我们来看一下这一块带了asy nc的,我们可以指定线程池让它异步来执行,但是呢,我们来看传过来的参数,如果我们是使用run after这种方式传过来一个comp future,然后相当于A组合了这个bab,两个只要有一个干完,我们就来执行C,我们这个runnerable。但是呢,我们发现run after either跟我们以前的run after bos都一样,只要我们是调用的run这个方法的,那么都是直接传入runable,无需感知我们上一次的这个A或者B的这个返回值,所以呢,我们如果使用它,我们是不需要返回值,而且呢,我们自己也没有返回值的。然后呢,我们再来看前边还有accept either accept other呢,同样是AB,我们来组合B呢,传入一个comp future,然后呢,我们再来传入一个C,但这个C呢,是一个cons,相当我们可以获取到上一次的返回值,上一次哪个任务执行完了,因为我们这儿只要有一个执行完,我们执行它,所以呢,我们会给我们传入我们刚才执行完的这个任务的结果,那么接下来就来执行我们这个C,但是我们这个呢,同样自己呢,也没返回值,所以comp future返回的也是word,那在上边apply to either这个。
01:55
那除了我们A来组合我们B传入这个B外,我们发现呢,它传的是一个function function里边两个泛型T跟U,我们再来看这个T呢,是我们组合的这个B方法的这个入参,相当于我们这个T能拿到我们已知,我们已知的上一步的返回结果,而这个U呢,就是我们处理完以后,我们还想自己返回一个,所以comp future也可以有一个返回结果,相当于我们这个方法就是能感知上边的执行,我们有入餐的,还有出餐的,那我们就来测试一下就行了,跟这个boss呢,之前都是一样的好,还是我们这两个future我们想要执行,以前呢,我们都是combine使用boss的方式好,我们现在是是来测试两个任务,两个任务,两个任务只要有一个完成,有一个完成我们就执行。
02:52
我们这个任务三们来测试一下这种效果,好,我们现在重新组合,我使用FUTURE01,我们先来调用我们下边的这个run after either的方法,好,我们点一个run after either,我们使用它还是使用我们自己的线程池好,我们来传入自己的线程池,然后呢,这一块传入一个runable,那好,我们直接纳达表达式,这runable我们要执行什么,我们把我们任务三我直接复制过来,好拿过来。
03:24
那这一块呢,我们就不要了,这是我们两个任务,只要有一个完成以后我们要执行的任务,当然我们要组合哪个,前面呢,传一下,我们使用FUTURE02,相当于FUTURE1跟FUTURE2,只要有一个做完,我们就来执行我们的任务,三,那好,我们现在来看一下我们的结果,我们启动起来。好,我们看到虽然这个任务一任务二都执行了,但是我们这个任务三执行是只要两个有一个做完就行,那我们怎么感知两个有一个做完我们就做了这件事呢?比如我们给这个任务二里边,我们让任务二执行的慢一点,我们thread点一个sleep,让他睡上三秒。
04:09
我们把这个sleep呢,试一下,我们模拟任务二慢,我们看是要三秒以后才有返回呢,还立即就返回,好我们来启动一下,那现在呢,只要两个有一个直行成你就行了,我看效果。那这一块呢,看起来两个都执行了,当然要明显期间我们应该这样,任务二结束呢,应该是睡完以后再结束,好,我们来重新启动。好,我们现在看到的结果就是我们并没有等待任务二结束,我们这个任务三呢就开始了,因为只要有一个任务结了那就行,这是我们说的run after other这个方法,那这个方法呢,就是不感知我们之前哪个方法结束的结果,不感知结果,不感知结果自己呢,也没有返回值,自己也无,返回值自己也无。
05:02
返回值。那接下来我们再来测试一个,除了有run after either,我们还有一个叫accept either,但是我们这个accept呢,可以接收我们上一次的返回结果,好,我把这个呢注掉,我们来使用accept的方式,FUTURE01.1个我们叫accept。S使用异步的方式,我们来组合零二,零二呢跟零一只要有一个人做完,我们来执行我们的业务,但是我们这个执行业务呢,我们先放在这儿,我们来使用我们自己的显能池,它里边呢,要传一个我们这个叫consumer,这个consumer我们看只有入残没有出裁,那就说明我们只接收呢,我们上一步的返回结果,无论是future future1还是f future2执行完以后呢,们拿到这个结果,拿到这个结果以后呢,我们在这来进行执行,我们来执行我们的业务三,我们把这个任务三来拿过来,CTRLC来复制过来。
06:00
来看这一块要报的异常,异常呢说我们这个FUTURE1要组合的这个FUTURE2,他们都应该是相同返回类型的,要不然我们这个接收值,我们也不知道我们这一块接收的结果是要用int的还是要用string的,那既然要有返回类型,我们就在这儿来写一个object。这样呢,我们就拥有相同的返回类型了,好,我们来测试一下,现在呢,我们来启动起来。那肯定还是一样的效果,只不过我们现在能感知到我们之前的结果,那为了效果好,期间我们把之前结果打印一下走。好,我们看到我们能感知到我们线程一结束的这个结果没问题,这是我们使用accept的方式,好,这是我们这个放在这他呢感知我们这个结果,但是自己不返回结果,自己自己没有返回值。那么这一块呢,也是没有返回值。
07:03
我们说的accept either,那接下来最后一个我们再来测试一下,我们可以使用apply,好,FUTURE01点,我们就叫apply,我们to either,我们两个呢,只要有一个执行完,我们把这个FUTURE02拿过来,我们既可以感知结果,把这个result拿来,然后呢,我们本身也可以返回结果,好比如呢,我们再来返回一个,我们来return一个,我们就把之前的结果拿来,我们调用它的to string方法,再来拼一个创。就叫箭头,哈哈,好,这是相当于我们自己也本身返回结果。答,简写方式只有我们这一句话的话,我们简写方式就可以不用写那个大括号了,我们只有一个参数呢,也可以不用写小括号了,好,我们来看一下这种方式,来测试一下走。好,那我们这个任务三肯定也执行了,但是我们这块没看到效果,那原因是我们没有输出我们这个任务三执行的语句,那我们就使用这种方式好,虽然呢有返回,但是呢,为了能知道我们这个任务三调用了,我们在这儿呢,再打印一下,那这个任务三开始之前的结果是什么,在这来看一下。
08:19
我们来启动测试。我们使用apply的方式,我们能感知之前的结果,而且呢,我们最终还有返回结果,想要感知返回结果,拿到这两个最终合并好的总filter。我们拿到这个总future,好,我们拿过来,拿过来以后呢,我们直接调用它的get方法,那就能得到结果,他点一个get。来测试一下效果,最终的结果肯定就是我们合并后的结果。好,我们得到了之前的结果,外加了一个,哈哈,这是我们说的这种apply的方式,Apply的方式呢,那就是自己感知结果,而且呢,自己有返回值,那还可以用到它的返回值。
我来说两句