00:00
好,各位同学。七大参数。全部说完。面试题考五个,我们全部讲,说七个一锅端,那么接下来。刚才同学们听第一遍不要着急,我们不是背题,也从不背题,踏踏实实按照大厂的要求,他考什么题目,我们把对应的知识点彻底整明白。那么接下来。线程池底层工作原理。挺好。这个和七大参数其实是一道题,但是怕同学们太负担太重,我分成两次讲。这一讲完了以后,你将会彻彻底底的理解这七个参数。同学们二话不说。我们直接。太高。要求同学们干什么事呢?先给我看左边这张图,右边你先别看。好,要求同学们干嘛呢?把左边这张图对应着1234567。
01:01
七大碳素。一分钟读一遍。好,各位同学。这道题目七大参数完了以后,就是配合着这七大参数线程池的底层工作原理。太高。首先。这就是我们那个银行那个线程池啊。XQ的执行执行什么呀?主线程是不是一个一个一个的客户上来了。按照我们的源代码,我们早上讲的几个十个用户来办理好同学们它是这样的。首先,假设今天是周末。单职的就两个工作人员,这两个工作人员这个窗口是常开的,假设哈,这个就叫Co pro Co process,一号二号窗口。第一步能跟上。来了。第一个第二个不用等,他们两个是不是直接来办理业务。这是第一步。
02:02
第二步。他们两个办理时间很长。不可能马上办完。这边唰唰的请求提交上来了。挺好。现在。一。完了以后第二步又来了三个顾客,张三,李四王五,一看一号窗口,二号窗口已经有人在用着了,我不可能去把别人给铲铲平了,然后我加三吧。第二步,他们将会去到阻塞队列。也就是我们说的银行后扣区。这一步能不能跟上好?单三等着又来了,李四,看哟,这两个,今天上着班的,这两个窗口有人。我后口区等着李四也来了哟,这两个窗口等着括出size,假设是二,就是这两个数一直在用着,一直满了腾不出来,那么我来了以后是不是只能去我们的block p总数队列里面后客区?
03:09
但是大家告诉我后客区的椅子和位置是不是也是有限的好?哗哗哗,人又来了。那么一号、二号窗口的工作人员马上给银行打电话,行长,今天来的顾客太多了,不行,咱们得把其他窗口再加快一些来处理这个洪峰业务,请求注意。最大数。包不包含啥子?啥意思啊?言下之意,这就刚才举的case啊,第一排的座位。有五个,但是今天单值的窗口只有两个,这两个是不是一直忙着满了。后客区阻塞队列满了。但是人还在哗哗哗的往上上啊,怎么办?跟行长打个电话。老大,赶快派兄弟们来救我。这个时候,银行行长马上把。
04:05
孙七孙八孙九,哎,你们仨支援一下。他们三个周末被叫坏的加班,相当于说这三个本来今天不开的窗口,他是不是也被打开了,那么第三步,也就是说从技术的角度而言。核心数满了,咱们去主车队列。阻塞队列就是后客区,后客区也满了,马上再加开能够受理业务的窗口,但是我们讲过一个银行的网点,它的受理窗口是不是固定的,物理上只有55个窗口,他不可能临时去拿水泥,拿墙、拿砖头,重新给你建一个吧,那这时候干嘛,如果。第三步。已经到我们这儿的最大数了,听懂。好,那么呢?继续办,但是抱歉,第三步我们已经齐装满园,本银行网点能够办的窗口全部打开。
05:05
第四步。要吐了。如果这个。分两种情况。如果哗哗哗的这个请求还继续上来,那么干嘛马上开启我们的拒绝策略,避免把线程池冲垮,避免让这个银行出现人员爆满踩踏事件明白,那么第四步就是启动我们的拒绝策略。拒绝策略又分为自找。那么默认policy。干嘛,那就是。奥一谈。线程尺码了,别装了,后面当然这个分别是什么。什么意思啊?待会儿我们会讲拒绝策略的一个知识点再说。那么言下之意,一。三四线程池共计四个工作流程,好,尤其到第三步。
06:01
已经到最大数了,分两种情况。如果已经到撑到最大了,就跟一个气球一样,膨胀到最大了,你不能再吹了,再再吹是不是气球就炸了,那就是干嘛启动拒绝策略,那么也就是第三步满了,你再哗哗哗的上,那么只能是为了避免气球爆炸,银行网点爆炸,启动拒绝策略。好。第三种情况呢?第二种情况是什么呢?哟,终于齐转满园能处理了。突然发现。诶,这个请求。慢下来了。流量降下来了,那么这个时候干嘛没有请求了?按照我们规定的时间,比方说随便说个数,五秒钟以内。没有再收到其他请求了,那么你跟我讲,这三个被叫回来临时支援加班的,已经达到最大数的这三个,慢慢的他们在规定的时间内就会被销毁。
07:02
之后这三个。加班的窗口就会关闭,继续回退到今天值班的这两个。何心素这么说能跟上?也就是到第三步以后达到max最大数了,如果需求哗哗哗的再继续上。就找阻塞拒绝策略。如果需求降下来了。没有那么多请求了,就会按照我们设置的时间长短、单位和数字,慢慢的从最大数缩回到核心数。同学们,整个底层工作原理四步能不能跟上?好,那么接下来。干嘛呢?请同学们继续上自习,读右边这张图。在读右图之前。七大参数。左边这个图脑补有个印象,然后对照着起来看,那么最终同学们请看一下右边这个图。
08:07
现成吃的主要流程。使用者就是来银行办理业务的这些老头老太太们。首先核心硕就是那个Co process有没有满,没有满,那不用填,我今天值班的是两个窗口就来了一个顾客,那我是不是可以给他办。马拉。后客区等着去阻塞队列,如果后客区椅子很多,阻塞队列没有满,等着等着等着等着来了就去后客区,但是抱歉,那后客区也满了。阻塞队列也满了,马上跟行长反映情况,兄弟过来加班,那么这个时候你懂的,是不是就是我们刚才所说的从两个或到五个,五个能跟上,又追加了三。和,也就说什么线程池是否已满的意思,就是是否达到最大色没有满。
09:00
干活满了继续执行是吧,拒绝策略。就这四部。好,那么要求同学们两个,大家简单的看一下。来,各位同学。我认为讲到这儿,结合我们的参数和银行的case,大致应该明白了吧。还不明白的同学,第三遍不要着急,你也不用记什么笔记,管生管养,管杀管埋,到时候都会给大家,这个时候大家请看。过一遍。我们创建的线程池银行网点。等待顾客上门来办银行业务第一步。只要我调用这个方法,是不是顾客就过来了?刚才我们讲了负循环,我们是不是往这个里面提交了十十个不同的请求,代表模拟十个用户,请看。先程式开始判断2.1。如果正在运行的线程数量小于核心数,那么马上响应干活啥意思啊?第一个顾客来了,那么几个出卡两个100%够用对不对?
10:11
如果正在运行的数量已经大于等于这个了,不好意思啊,第二个来了,二号窗口。那么345呢,是不是按照按照我们所说的核心数括这个满了,第二步是不是进咱们的阻塞队列,那么请看2.2,那么将这个任务放在哪队列。2.3,怎么队列也满了呢?那么也就是说后客区满了。今天值班儿的。扩满了,那么干嘛马上。直到扩容且正在运行的数量还小于这个呢,比方说我们刚才建立的这个是几五。我们今天值班的就两个,好,那么马上干嘛?我们呢,还小于这个呢。
11:00
还是要创建非核心去执行,但是如果队列满了,并且已经高过这个了。不好意思啊,那么线程池就要启动饱和拒绝策略。第三,当一个线程完成任务,它会从队列中取下一个,这个好理解。第一个顾客走了,马上按个叫号键,请三号顾客到一号窗口办理业务,那这种熟悉的声音都听过吧?那么这个时候他是不是三号顾客就从后客区就阻塞队列里面,自动的又跑到这儿办理业务。好,那么接下来当一个线程无事可做,超过一定的时间,我们说过了,这三个哥们是不是叫过来临时加班扩容的,那按照我们的规定,时间超过了这个keep alive进程池会判断。如果当前运行的线程数量还是大于这个核心数,今天值班就应该是两个,能不能停掉干嘛?所有线程时,所有任务完成后最终会。怎么着收缩,所以说收缩到。
12:00
核心数的大小,那么同学们,我认为线程池这些讲到这儿应该是清楚了它的底层原理。能跟上同学们。好,那么这边。就是我们全部的线程池的一步一步的处理流程。再说白点,就四步。第一个核心树啊,能干活的。第二个核心素用着呢,那满了怎么办?后客区主侧队列边待着。第三步。干嘛扩容,扩到这个线程池所能达到的最高极限max,那第四步呢?两种情况。如果还是哗哗哗的往上。拒绝策略。如果慢慢的。减少了,那么会怎么着收缩到在一定的。时间以内。这三个被叫过来加班的是不是无事可做了?没有那么多人了,那么这个时候干嘛无事可做,且超过一定时间的就会收缩到扩,这么说同学们能跟上,OK,那么这个就是我们线程池的主要工作流程。
我来说两句