00:00
好,各位同学,我们继续。大家呢,再坚持一下。那么。我们接下来讲一道重点的面试题,那就是线程池里面的七大参数。那么刚才呢,1234567,那在这个方法里面七大参数。好,那为了避免待会儿反复的切换。那就这样吧,我们呢,先从源码上呢,给大家呢给他。抓一张图哈,老师这样的话呢,讲课。方便一些。那么好,这是七张图,七个参数抓一张图,那么接下来我们就要好细细的。白使白使1234567这七个参数分别是什么意思?好,一个一个来。首先。第一个参数。Co process俗称核心线程数,是线程池中的常驻核心线程数。
01:00
那也就是我们这儿的。第一个参数那。为了给大家更形象更深入的理解,那老师呢,这儿呢,举一个银行case的。案例呢,给大家呢说清楚。那比如说哈。现在这个黑框框。那么呢,就是我们的什么呢。线程池就等于一个假如说哈,就是我们的一个。银行。晚点。OK,那么现在好说,现在这个池子里面,那么一个银行网点,你进门了以后,如果说顾客从这进来,要办理各种各样的业务,你要开卡,你要注销,你要开通短信提醒,你要去开通跟支付宝的关联等等等等。很简单,一进来哈。这假如说同学们注意。我们这个黑色的框框,那么就是我们的是吗?受理窗口,那言下之意,这个东东我们先这么说哈,这个东东呢,就是我们的干嘛。
02:10
物理上的。受理。窗口,那么也就是什么办理业务的窗口。好,那回答我一个问题哈,各位亲,我们都明白,大家都清楚,任何一个银行网点,你懂的,他是不是需要有一个最基本的办理窗口,换句话说,这个时候是不是叫今日当值窗口?那么好,一样对应着我们这你一个线程池里面,我不管你是多少假设哈,我们这有个初始化常驻的核心线程数。Size核心线程,那么有点类似于我们这儿。就有两个窗口,那么这两个窗口好,假如说这个和这个,那么这两个窗口,那么言下支线就是我们的什么。
03:10
今日。单值窗口。好,那。OK,那么这个也就是我们所说的。核心数。好,那么来,同学们。这个核心数。沿下支线就像是什么,我们县城里面干嘛呢。今天在线程池里面所拥有的两个。值班的人员好,那么lawyer什么概念呢?创建线程池以后,当由请求任务过来,就会安排池中的线程去执行任务,近似的理解为今日单职县城,那么按照一种生活上的case啊,那假设哈,我现在来了两个顾客了,进来。
04:00
我们两个是第一个,第二个顾客,那么OK。一号顾客去一号窗口办理,二号顾客去二号窗口办理。那么言下之见,我认为。核心数就是我们今天今日单值常驻线程指的线程指标,那么。这个好理解。第二点。当核心线程池中的线程数目达到。托普之后就会把任务放到缓存队列。好,那么等一会儿先混个眼熟,这出现一个单词叫队列,前面是不是杨哥花了很大的代价给大家讲过队列这么一个东东?那么接下来我们请看。第二个参数叫max,那么言下之意,最大的核心最大的线程数,也就是说这个线程池啊,它能够容纳同时执行的最大线程数,此值必须大于等于一,那么有点类似于我们刚才已经介绍过。
05:01
物理上的受理窗口干嘛呢?也就是这个框框里面。它最多假如只有五个窗口,那么眼下直线我们。今天来了两个人,关关在这办理,那么如果窗口不够用了,那么言下之意干嘛右边的这几个窗口这一块空余的,那是不是会被人。直接叫醒,那么把这个窗口打开再继续,有点类似于线程池里面的。线程速扩容了,继续加大能够处理请求任务的线程数,有点类似于现在晚点来的人太多了,那么我们是不是要加大处理窗口的开放数,那么OK。假如说这。又有。三个窗口,那么OK。来,那么同学们。
06:02
这个时候。过来。那么这三个窗口。干嘛呢?言下之意就是今日当值的两个,那么再加上红色的这三个,共计五个,那么你看是不是这个框框就已经。全部撑满了,那么言下之意,这一块相当于说就是我们的。什么东东马克。那么也就是说。我现在。干嘛呢?物理上我这个银行网点,也就是我这个线程池啊,最高峰只有五个受力窗口,最顶点这个池子里面也只有五个线程数,那么这个时候干嘛?这个线程数就是线程池能容纳同时执行的最大线程数,类似于这个线程池就是一个银行网点。
07:04
它能够容纳的同时开放最大物理窗口数的上限。比如说我们这张图,我们现在。同学们呢,都清楚,那么干嘛呢?我们如果开放了以后,现在是不是两个今日当值的?那么假设我们再把旁边的窗口唤醒,那么这三个二加上三等于五,那么说明我们的物理窗口上限就是五个。好,那么往下翻再来看。三和四,我们待会儿说现在呢,干嘛呢,暂时。不给大家进行详细的讲解,因为什么叫多余的空闲线程,那么这个时候干嘛呢,给大家呢,要理解多余这两个,那么OK,简单一句话,这个时候三叫。存活时间四叫设置时间的单位是分钟,是秒,是毫秒,那么三四连起来说,但是我们待会儿来聊。
08:11
好,那么接下来我们先看第五个参数叫work,那么言下之际大家看,一旦说过了今日单值啊,这个网点有两个,这个线程池里面假设初始化的线程数啊,就是两个。二最大线程数啊,有点类似于数据库的最大连接时速,那么。言下支线,那么假设啊,按照我们这张图,两个黑的加三个红的,那么我们的最大数的上限就是什么五个。好,三四,我们待会聊,那么先看第五个参数,Walking是个什么东东?Blocking queen是个什么阻塞队列。那么言下之间。杨哥,这个阻塞队列又怎么说呢?听着。
09:00
我们这第五个参数是什么?阻塞队列?那言下支线这个阻塞队列请同学们注意干嘛呢?就是类似于。我们银行里面的什么候客区。好,有点类似于这样啊,同学们。现在呢,我们已经知道了。今日单值啊,只有两个。窗口那么好,我们最高上限是五个窗口,但是现在呢,我们的人来了,那么假如说啊,同学们一号客户。在这儿办着,二号客户在这儿办着,因为我们都清楚今天是不是假设今天是周末,那么今天的上班的工作人员只有两个,不像周一到周五全部齐装满园,五个窗口全开,达到max。
10:01
那么后面第三个,第四个,第五个。客户进来了怎么办呢?那么这个时候干嘛,我们是不是只能。慢慢的等待,等一号、二号窗口完了以后,等待着银行的工作人员叫号,比方说一号。顾客办理完成了,丁玲马上按排号器,会说下面请三号顾客到一号窗口,我相信这个熟悉的场景大家不陌生。那么345。进来以后他不能去加三去干扰一和二的办理啊,他们还没办完呢,那么所以说在这一块就会有我们的一个什么东东呢,比方说哈,我们一个蓝色框框,那么这个蓝色框框就是我们的什么东东。阻塞队列,也就是我们的什么后客缺。那么言下之意。
11:04
345进来了以后,进门发现一号二号窗口就是Co size核心数已经被用满了,那么这个时候345只好在这儿进行等待,那么眼下支线就把我们的三号四号五号顾客放在这儿,哎呀,给点水果,然后呢,前面挂个电视机,让他们看着等待着叫号,那么这个时候就是我们的什么第五个参数。好,就是我们的阻塞队列,那么接下来我们呢?来看第六个参数,那么在这儿也有叫thread factory线程工厂,那么言下之意表示生成线程池中工作线程,线程工厂用于创建线程,一般什么情况用默认就OK,那言下之意,那么这个线程公产又是什么意思呢?那么同学们我们可以把它理解为什么呢?注意有句话。
12:13
是不是叫用默认,那么这是什么意思呢?那么相当于哈,我们银行网点的什么。比方说外面的什么。Logo,比方说工作人员的制服。比方说工作人员,他们所带的是吧。胸卡等等等等,那么言下之县,这个县城工厂又有点类似于假设哈中国建设银行回龙观支行。它外面。牌子啊,那么中国建设银行的那个图标,那个logo,肯定每一个网点都一样吧,那么只要你进去中国建设银行了,那么它里面肯定会有一个标配,叫大堂经理等等等等,那么说白了就是说这个参数啊,就是我们什么在这个线程池里面生成县城工厂,生成县成的这个工厂类似于各个银行网点的标配,比方说有个logo,有个饮水机,有个大堂经理,你们的工作制服,你们的胸卡都一样,那么这个我们一般用默认。
13:25
好,那么接下来。同学们,我们还有347没说呀,那么接下来我们就要开始随着我们的业务的变更,我们来说说三四是怎么起到作用,好,那么来同学们现在呢,有这么一个问题了。刚才说过了,345在后客区,你把人家放到了阻塞队列,那我现在的问题是,假如说345以后六。七。八顾客也来了,那这个时候你懂的,今日单值窗口已经满了,那么这个时候阻塞队列,也就是我们的后客区345用户也已经给他满了,那这个需求现在呢,就分两种,假设这个需求还是什么哗哗哗的往上好,第一种情况,那么干嘛呢?678。
14:25
也进来了。哇塞,那么同学们,你知道的这个银行网点的人是不是高并发人越来越多了,那么678顾客进来了以后,我往上看。扩核心素,一号二号窗口满了,那么三号四号五号顾客又在后客区满了,那么这个时候干嘛呢?那678你怎么办呢?他要去凑客去去坐,没有位子了呀,而且345还在这等着呢呀,那么这个时候你懂的干嘛?他们是不是就开始有点冒火生气啦?
15:00
那么你不能让顾客长时间等待啊,那么接下来。我们再杀个回马枪过来说一下max,那么这个时候干什么呢?扩窗口满了后,客区阻塞队列也满了。那么。第三步,这个线程池开始扩容,那么这个时候干什么呢?有点类似于假设一号窗口的组长给银行行长打电话,领导今天只有两个窗口,但是来的人特别多。我跟张三,我们一号二号窗口已经无法处理这么多请求了,麻烦你通知什么呢?李四李五李六他们三个过来临时加一下班,那么这个时候我们的这个线程池里面的线程做是不是将会从二号一直开通,三号四号五号窗口全部打开来处理这些请求,那么这个时候你可以把它理解为这个就是我们的什么呢?
16:09
加班窗口。好,我们可以近似的理解为哈,比方说今天是轮不到我们几个上班了,但是没办法请求数弄过来了,那么OK,我们这个时候你懂的。干嘛就被扩容,那么言下之意是不是从二砸到了五,那么言下之意这个是不是就达到了我们线程池里面的最大线程做这么说能跟上,那么这样的好处呢?言下之意678好。那么。厚道的。接下来678号顾客该如何处理呢?这块流程比较重要,杨哥先提前剧透,同学们,我后续会详细讲,这你只需要搂一眼,有个印象就行。
17:02
换句话说,这个678会跑到我们的新扩容的窗口去抢占,还是会回到获客区去等候呢?大家请看参数,待会我们还再继续说啊。先提前剧透下面的底层工作原理,请大家先看到这儿啊,这些是些什么,后面我会详细讲,那请看2.3,如果这个时候队列满了,那么大家请看现在是不是队列已经满了,后客区阻塞队列已经满了。且正在运行的线程数量还小于这个的话,那假设啊,先进来了这个六,那么换句话说是不是只进来一个六的时候,那么正在运行的数量还小于这个max还没有全部占完呢,那还要创建非核心线程,那么这个是扩嘛,换句话说就是这个是核心线程。还是要创建非核心线程,就是要扩容并立刻运行这个任务。所以新来的我们这个料它有点。
18:05
无耻。直接加塞,抢占我们的加班窗口,这一步请大家注意好,那么678。这块就是一个德行啊,他们三个会去把加班同时的扩容窗口给挤占。那。怎么证明?何以见得678他们会去抢占加班窗口呢?再来看这句话啊。假设我们现在啊,就说。队列已经满了。345大家都知道后客区已经满了,只有三个座位啊,假设按照我们就说本例啊,那么假设我们现在呢,就只单独进来了一个六。且正在运行的线程数量还小于max,那假设只有一个六,那么相当于说有一个六,但是有三个红色窗口,那么是不是一个六号顾客小于这个数嘛?
19:03
还是要创建非核心线程,并且会怎么着立刻运行,既然是立刻,说明它就不会去阻塞,那么我们的六号窗口并没有区域后客区阻塞队列,而是直接抢班夺权,直接抢占,怎么证明呢?来,你先不要管这个是什么啊,后面我们会讲一个东西叫手写线程池啊,杨哥为了来模拟给大家证明,先提前给大家看一下啊,我们就以这个例子啊,因为他的情况有很多种,我们现在就以我本次讲的这个case。两个核心素。两个合心素最大数是到五个,那么是不是就是二加上三个红五,这是max数,相当于说这就是加班窗口,三号,四号,五号窗口,那么现在的问题就是,如果说扩容了一号,我们来露眼。我们。这个是。
20:00
阻塞队列link block前面讲过啊,等候区的话有三个座位,还是按本列345这三个,那按照我们的说法,如果说核心数满了,等候区也满了,我们是不是要扩容到五,那么请大家看啊,我现在六个人进来,注意。12345,我最多只有五个窗口,现在是六个顾客,那我们的程序干的这活呢,就是模拟六个顾客来办理,但是受理窗口只有五个,每个顾客办四秒钟,那么现成是很快的,一下子就加完了,那是不是按照我们的推论,一号顾客一号窗口二号顾客二号窗口345进候客区?假设第六个顾客他要是进候客区了,那么现在新扩容的三号窗口就应该服务35号顾客,假设我们的第六个顾客他没有进候客区,那么他马上要进。我们的扩容以后的三号加班窗口,来看看我们的推论是否正确,深刻体会这句话,立刻运行这个任务,好,那么同学们走起。
21:08
打卡。现在是不是一号窗口一号顾客二号窗口,二号顾客来三号窗口,那么。服务的是几号,六号顾客345是进我们的。等候区的看到了吗?那不伐我把它。干到八,那么现在这个时候,同学们请看。我们最大的是不是可以承接五个,嗯,所以说一口气大家请看12345是不是一下子打满,那么请看。高亮显示的以上部分,一号窗口一号顾客,二号窗口二号顾客。请看扩容后的三、四、五号窗口,服务的是六、七、八号顾客,并没有先服务在候客区的三、四、五号顾客。OK。
22:00
这用些个小case啊,先给大家。做一下简单的说明哈,所以说。新进来的是立刻去抢班夺权,好,那么我们的第三步结束,那到第四步哈,如果说我们这个需求还是哗哗哗的往上涨,那就麻烦了,我们的大堂经理。那比如说啊,我们的大堂经理这个时候。就比较郁闷了。他要干的活呢,如果说还是这么涨,全部的窗口都满了,那银行会怎么办?生活中的case是不是会摆个牌子啊,在门店已经到了业务上线的最高峰,请去其他门店办理,所以说在这块的话,他呢将会启动我们的一个饱和拒绝策略。也就是说不再办理新的业务了,那。假如说我们的这个业务量。
23:00
会。下降了。那们别忘了,我们这儿还有两个参数啊,叫keep alive的time和unit,这个是上面这个值的单位,十分秒贴都可以,这个叫多余空闲线程的存活时间,那它的意思就是你这块我们这三个是加班的。换句话说,如果在我们规定的时间内,这个业务量下降了,按照我们的约定哈,给我们一个时间假设哈,现实生活中。刚才是很忙,现在过了一个小时以后业务量很少,那么。我们这三个加班窗口可以在我们约定好的时间内进行什么关闭,也就是说我们会进行一种东西叫缩容。慢慢的又从最大数回退到我们的cos数,这么说能跟上好,所以说这个就是决定了当前线程池的数量,如果超过了这个哈,就说白了,超过了那时候是不是扩了。
24:08
扩了扩到假设扩大我们最大数。当空闲时间达到了我们的设定的这个值的时候,多余的空闲数啊,就是现在就是。银行人员比顾客还多的话,那么多余的这些工作人员。会被销毁。骚扰。直到。缩到只剩下cos现场为止,OK,那么这个就是我们现场吃的七大参数和相关流程的讲解和介绍,后续我们会详细介绍底层工作原理,这最后来做个小总结。首先今日单值cos,然后等候区阻塞队列,然后cos满了,阻塞队列满了,那么接下来扩容。那扩了以后又分两种,如果业务哗哗哗的往上涨,那不好意思啊,直接是拒绝策略,请不要来办理业务了,如果说业务量下来了,那么在我们规定的一个时间单元。
25:09
里面会慢慢的进行缩容,最终会从最大缩缩到我们的核心缩,OK,那么这个就是我们线程池参数的一个介绍。
我来说两句