00:00
各位同学大家好,接下来我们给大家说一下future和线程池。来这一章非常重要,有一个关键的知识点我们都清楚,其实底子而言已经就是future,异步任务和我们线程值,无非就是用你自定义的,或者用它默认的fo join,这是第一步。第二个上一讲呢,我们给大家说了这些方法。啊,我不知道在ID提示工具的这个提示下,有没有发现几乎这些方法后面都会再加一个异步这样的方法,那么他们有什么区别?好,下面我们代码说话。来,那么节约时间,提前写好一个线程池啊,那么接下来同学们走,Come up the future还和以前一样。那么。搁到这儿了以后啊,我们呢,嗯,直接呢。先out,假设这是我们的一号任务。OK。来吧,来看一下它是哪一个线程池里面的线程所完成的,那么supply这个,那么需要有一个。
01:04
那么这儿呢,我们就。返回一个abcd,好,这个呢很简单啊,其实它呢也倒不重要来,重要的是下面then,大家请看,我们就以为例啊,大家请看run,有这个简单的,也有加个异步的,那么我们前面学过的apply一样,也有一个简单的加这么一个异步的,再来我们accept。大家请看是不是都是有配对着这么一个异步的一个动作,甚至它可以使用自定义的线程池哦,那么这儿这三个原理都一样,所以说我们用一个最简单的then run。那么。它仅仅是一个线程。和我们之前的没有太多的关系,OK,那么所以说这儿呢。我们呢,和刚才一样啊,就偷个懒吧,就把他给我拿下来,那么这个呢,就是我们的什么。二号任务这波没问题吧,那么同学们,这波二号任务以后来接下来我们直接再过来。
02:05
这是三号,那么这是四号哈,我们写多一点好了,那么在这块由于到到最后的话呢,它呢肯定呢,也不需要你有什么返回值了啊,虽然说这儿有,但是我们不用我们说过run的话呢,它很佛系。你这一步完成了以后,到我这一步,到我这一步了,我也不依赖你需要做个什么,我也不需要产出什么,没有输入参数,也没有返回,好那么在这啊。那么假设啊,我们甚至呢,可以再复习一下,那么假设两秒,那么time。哎,这是一个什么time second,好。咱们各位亲。OK,那么为了看到这个效果,我们在这儿呢,直接呢,嗯。假设第一个是要。20毫秒。那么基本上啊,这个呢也是20啊,这个呢,就来个十吧,随便啊。好,那么各位亲。
03:01
我们接下来我们就来看看了,现在我们什么都没加,全部有默认的,那么此时大家可以看得出我这个pro根本没有加入,只是在开始定义和最后关闭没有用,那么没有用的时候,大家请看我们后台打印出来,他们现在到底这个任务是谁做的,来,各位亲。走一步。大家看一下效果,1234号任务怎么着都是用的默认的folk doing po这个,那么虽然说这个池子里面有五个线程,但是呢,几乎呢,一个人就可以全部搞定,OK,不用上下面切换,那么当然这个那就是我们这后面这个好这个不多讲,那么下面的问题是这个是then run啊全是the run好说那么现在。假如说我们全部把它变成这个,那么大家再请看啊,第一次啊是用for doing,那么第二次啊,我们现在用。兴起一个z run think,它是什么?那么大家请看默认用的什么动还是我们的fo,就音谱和之前的水一回事。好,接下来的关键来了,我们呢?
04:07
直接呢,恢复成这个啊。来。完了以后传入我们的线程池,这个是我们自己自己自定义的啊,那么来。现在还是符合join,那么现在呢,我们这儿相当于说第一个任务,我们要用自定义的线程值啊。问题紧接着第二个他用的是fo po呢,默认的还是用你自己自定义的,来同学们我们来演示一下。来,大家请看。怎么着,我们得到什么结果,只要你第一个用了以后,你第二个也会跟着你用同一个线程池,大家看没问题吧,这是第三种情况,那么接下来啊,不安分了。我们第四种情况。注意,第二个方法不是then run,是then run1步,那么这个时候大家请看我们会出现一些什么样的问题呢?
05:02
直接起道。老爷。有没有发现一个问题,只有第一个是你用了你指定的。Th pro,只要你think以后的另起炉灶的基本上又回到了我们的符join。哎,这就是什么,全部用。不带线程池全部用then run,不带线程池用then run c全部OK,第二种用then run带线程池,第三种带形成尺用then run1步,那么这个时候这四种情况给大家演示以后我们的结论。是什么?为什么会产生这样的原理呢?来,同学们请听分析,听好。如果我不传入。自定义的线程池啊,那么好家伙,那么这个时候同学们请看啊,有异步的,也有run的,怎么着,大家几乎都用默认的线程池,不出意外的话,好,假设我们现在传了一个自定义的线程池,OK,好了,那么就要看。
06:06
假设第一个方法,第一个任务,你用的是这个自定义的线程池,第二个是the run,那么就是什么?我紧紧的跟随你,步步为营,按部就班,那么我呢?这么干,如果你传了自定义的一个线程池啊,你执行第一个任务的时候,传入了第一个自定义的线程池,第二用任run方法执行第二个任务的时候,第二个任务和第一个任务用的是什么同一个线程池,那么所以说同学们请大家看一眼啊,此时我传了这么一个线程池,第一个任务用我们自定义的这个,第二个任务也用我们自定义的,第三第四也一样,OK,都是跟随战略,但是如当我们调用这个执行第二个任务的时候,那么第一个任务用的是自定义传入的,第二个任务用的是符合就椅,它会另起炉灶。好,那么同学们我们再来演示,来,大家请看啊,我们就以第一个来决定这个线程吃的起驶,那么火车跑得快,全靠车头带,你这个车头传不传线程吃好大家请看,我传了以后,我第二个是异步的。
07:10
我根本就没有跟你用同一个,我另起炉灶好,这个呢,就是我们的两个重要的结论。来,那么现在啊,再说一点。由于呢,我们还有第三种情况,但是实际工作中啊,很少出现,因为呃,怎么着啊,你这块执行就要耗费点时间,但是大家请看啊,有时候main线程也会出来给你夹杂着来给你开个玩笑,扯淡来,同学们请看我这很快啊,不用再耽误这20毫秒了,如果我一执行。来。会出现一些什么样的情况呢?此时我用的是什么?一波第一个好说,可问题是现在我把它改了,好,再来跑一次啊,同学们请看。来怎么着,没没没,这就是我们现在所说的第三种情况,处理的太快了,系统的按照它底层的优化和切换原则,尽量最快的上下面切换你这个池子,你在处理这个的时候。
08:10
太快,我们马上到,下面也不劳烦你了,我们线程也就把这个东西呢给你干了,OK,所以说不一定你指定的线程池人家会直接用,看你程序处理的时间好,那么下面我们恢复到正常,一般情况下再带着大家最后说一遍,我们来进行源码分析。第一个如果你带了这。后面用的呢,是then run这样的,那么听好,后面用的和前面一样,那么就是我们笔记所说的。用了自定义的线程池啊,执行用then run执行第二个任务以后,第二个任务和第一个任务是共用同一个线程池啊,OK,那么同学们可以看得出,如果你现在。变成这个了,要另起炉灶,OK,那么来同学们,我们看一下,最后看一眼,我传了这个第一个用你自带的。
09:00
OK,第二个开始还是用fo join破默认的,哎,这个就是我们的第二个结论,调用这个异步的时候,异步嘛,另起一个炉灶。那么第一个任务就用我们自己传入的,自己带个过来的,第二个任务就用我们的join线程池,OK,那么至于说其他的,凡是带着这样的规律,均和上面三条一样好,那么为什么会变成这样呢?那么下面我们源码分析一下,好,那么同学们。下面先请看then run和then run1步,这两个其实都在一块,这个这个好,区别是什么?输入参数都是传一个事项的run接口的。但是底层调用的这有个E,这个then run,它是个nu,而这个叫一个什么异步的线程池,好我们不妨这个是nu,好说没什么可看的,我们先看更复杂的,那么现在它要传过来,这是个啥?这是一个什么线程池,哎哟,这有一个三目运算符,好,这有个通用的普通的池子啊,这调一个复合,就用这样的一个方法,那么基本上就是它的核数,基本上现在的CPU都会大于一了,对吧,那么换句话说。
10:11
这个一定是返回一个什么错,那么这个是错,三目运算符获得的效果是什么处的话,返回第一个,哎,所以说如果你现在干的。用的是异步这样的方法,默认就是给你调用join破这个线程池,OK好,那么同,所以说同学们通过这我们的一个调用要清楚,你要是用这个相当于另起炉灶,重新调用这个复合旧用铺这个线程池好的,那么这个就是我们一个源码分析,那么给大家呢,也抓了图笔记做的规规整整好,只要这个是错三目运算符这个。是返回for join,那么这个就是他们。看future和线程池的说明关系,那么日常工作当中啊,至于说线程池如何优化,我们可以大家呢去看一下,呃,我们B站上面其他的视频,好,线程池就给大家介绍到。
我来说两句