00:01
各位同学大家好,下面呢我们继续来学习线程池,刚才呢给大家介绍到了线程池底层的七个参数分别都是什么含义,那下面呢给大家来介绍一下线程池里边底层的工作流程是怎么样,也是它底层是怎么执行的,然后这里边这个七个参数在流程中到底是怎么去用的,下面给各位来做一个详细的介绍,关于线程池的底层的工作流程。然后工作流程呢,我在这里边给大家提供一张图,这张图中呢,就清楚的描述出来了,它底层是怎么执行的,那我下面给各位同学咱就来详细分析一下它底层的流程是怎么样的,那这个图我们来看一下啊,里边是这么一个结构。好,咱们来看一下。这个图怎么看?我来说明一下啊,首先咱们看我里边标注出来了有1234这些值,那这值怎么样,咱们一步步来做,首先我们看第一步,就现在我的主线程软内中的run方法执行了,比如说咱们刚才代码中的这段代码。
01:16
大家注意在里边啊,咱们就直接用了一个这个相关的操作最终实现,然后这过程中咱是不是创建了一个线程,在线程中我们执行了一个就是这个XC口的方法,然后在方法中加上是不是有一个拉表式,这里边有那个相关操作,然后在这个XC的方法执行的时候呢,也就是这个代码中,它在执行的时候,这个线程池中的线程会创建,也就是说你在这一行的时候,其实这个线程并没有创建,当你执行这个叫XC的方法之后,这个线程才创建,但是它里边具体说是那个runable中的run方法,这个时候会创建线程。
02:00
所以这个各位记住啊,里边第一点,当执行了XC的方法之后,线程才会创建是里边的第一步。然后线程创建之后,下面怎么做呢?咱往后看,我这里边有几个值大家看啊,首先你看这个部分。是不是叫扣碰,就是咱说那个核心线数量,或者说叫常驻减数量,我目前这里边那个叫做。常驻的线程数量是几?是不是这个二啊,然后我们目前这个最大的线程数量是几?是不是有五,你看啊,这是两个,这是三个加起是五个,然后这部分是什么?是咱说那个阻塞队列部分。阻塞队列,比如说我约定阻塞队列的大小是三啊,当然你可以是四,比如咱约定是三,所以现在是这么一个结构,那这过程是怎么执行的呢?比如咱们现在我这里边,当我调用了IC的方法之后,目前就创建了线程,线程冲里边就是有两个长度线程,最大是五个线程,它的组的队列中最大大小是三,这个时候比如说咱来了第一个线程,那第一个线程怎么做?它会先到这个常驻线程中做处理,这就是处理第一个线程。
03:23
然后这里边来到第二个线程,到这里边进行处理,这是前两个,比如说现在我这两线程都用完了,目前正在处理中,现在又来了第三个线程,那大家想一下,现在我来了第三个线程,它会怎么做呢?或者说该怎么处理?大家可以考虑一下第三个线程放到哪里,给各位说明啊,第三个线程它并不是创建新的线程,而会放到你的阻塞队列中,这就是第三个,包括你这里边来第四个、第五个都会在阻塞队列中进行等待,因为现在好比说银行有两窗口,这时候两窗口在处理两人的业务,这时候来了第三个人,第四个人,第五个人,那这三个人是不是坐在旁边进行等待呀,好比说坐在银行那个椅子上在等待,这就是组的队列,第三个,第四个、第五个他们目前正在等待。
04:25
那这个时候,比如说我这两个人业务没有处理完,这三个人正在等待中,这个时候呢,又来了,里边这个就是第六个人。那大家说第六人怎么做?它的做法就是啊,目前给你在创建新的线程,比如这个过程它会处理里边的就是第六个,第七个,包括第八个又会给你创建新的县城进行处理,就好比说我现在啊,去银行办业务,这时候银行窗口都满了,又做了很多人把座位也都坐满了,这时我又进入银行中,那这时候可能有一个场景,各位同学应该都感受过啊。
05:06
这时候银行大堂经理找到你,说现在你要办什么业务,比如你说我办银行卡,然后他说你跟我过来,我帮你亲自办理,那这时候就是创建新的线程,再处理你这个请求,这就是处理第六个,第七个,第八个,那这个时候各位注意啊,比如现在我的常驻线程满了。阻塞队列也满了最大线程数也达到了最大的,这个时候比如说我现在又来了第九个这个请求,那你说这时候该怎么做。第九个请求,那你注意啊,第九个请求来的时候,我现在这个银行是没有处理这个能力了,所以第九个请求他做什么事情,就会直接执行里边的这个过程,就是咱说那个拒绝策略,给他做个拒绝,比如说银行当堂经理找到你啊,说目前我们银行已经满了,就没有处理能力了,你可以出门到别的银行去做处理,这就会执行你的拒绝策略,当你这个线程数都满了,阻塞队列也了,这时再来新的请求,直接执行拒绝策略。
06:16
所以这是我们说的这个线程池底层的工作流程里边就是这么做到的。然后在过程中呢,有两个细节给各位再说一下啊,第一个细节,当你执行了ICQ的方法之后,线程才创建,然后第二个细节就是大家注意啊,比如我现在啊。第一个第二个常驻线程满了,第三个,第四个,第五个是不是在阻塞队列中进行等待呀,这个时候我来了第六个线程,它说会新建线程来处理啊,那这个问题就是当你来了第六线程,它里面怎么做,就会给你新建线程去处理,第六个,比如说这个345继续等待第六线程,它会优先给你办理业务,比如现在银行都满了,你进入银行,那大堂经理给你自己亲自办理你的业务,他会立刻给你办理,所以它里边这个流程,当你这个常驻县城满了。
07:17
队列也满了,你再来请求,那他会优先给你做处理,让你345继续等待,这两人继续办理,然后我优先办理第六个请求的业务。所以这是我咱们目前提到的线程池底层的工作流程,各位把这个给他知道,比如我刚才说的这个过程,大家把过程好好给他去。想想,包括过程,用自己的话能给他描述出来。所以现在这个就完成了,然后完成之后呢,刚才提到当咱们来了第九个线程,就是我现在队列满了,线程也满了,那它执行是不是叫拒绝策略,在咱们的拒绝策略中有四个基本的拒绝策略,那我下面把这四种拒绝策略是什么给大家来解释一下,你说我这里边这张图上给大家说明的这几种拒绝策略。
08:12
啊,那我来说一下啊,这张图我先保存一下。线程池。底层的工作流程,然后下面呢,给大家再画一下,这里边就列出了咱们里边的四种拒绝策略,那四种策略咱们一个一个来解释一下,这四种策略到底都是什么含义,那我们来看一下啊啊,咱直接看我的文章中,你这个看的比较清楚,首先大家看第一个策略。第一个策略呢,它是一个叫默认策略,这个策略是什么意思呢?比如说我现在线程池里边的常驻线程已经满了,队列也满了,也达到了最大的线程数,这个时候我再来这个请求怎么做,直接给咱们抛出异常,这就是我们的第一种场景,就好比说现在我这里边银行满了,然后去银行,再不有银行告诉我说你现在。
09:09
你可以出门到别的银行办理,我银行不能处理你的请求了,这就是第一个场景,直接po异常,然后里边还有第二场景,你看这个名字啊,叫这个coal res,这个policy,这是什么意思啊,就叫调用者模式,什么叫调的模式,比如现在你去银行办理业务。这时候银行呢,里边人已经满了,这时候银行他肯定不能处理业务,那这时候你找银行说现在为什么你不处理work,然后银行告诉你说谁让你来的,你你可以说可能是我朋友来,然后银行说谁让你来的,你找谁去,我银行已经不能帮你办理了,你可以找你朋友让他帮你办,他让你来的,那你找他去,而不要找我银行,这叫调用者这种营方式啊,这么说有点不讲理啊,但是这也是一种拒绝策略。谁让你来的去找谁,我现在银行不能处理你的业务了,这是我们的第二种模式,叫调用者模式,然后里边还有第三个这个模式,调discard o这个policy。
10:14
这是什么意思呢?抛弃队列中等待最久的任务,然后把当前任务加到队列中进行等待或者进行处理,那这什么意思呢?给大家还是举个例子啊。比如说现在啊,我去一个饭店吃饭,因为各位同学都知道热门饭店,你要吃饭是不是都要排队呀,比如说现在你在上午九点一直排到了下午五点,一直没排上,这时候还在那里排队,比如说这个时候呢,突然这个饭店又来一个人,那这人可能这里边这个饭店让他直接吃饭,而不会让你去吃饭,就把你墨迹给你丢弃掉了,因为他觉得啊,你从上午等到了下午,觉得你这人可能你不想吃饭,你要想吃饭,他不会等这么久,他可能就把你直接抛弃掉了。
11:04
这就叫做抛弃队列中等待最久的任务,比如说这张图上咱们看啊。比如现在我在这个图里边,就是我的这个人,比如他等了很久,一直没有等上,那最终这个人就让他不再等待了,直接把他抛弃掉了。而处理别人来的这个请求,这是他的一种拒绝策略。就是咱们刚才提到的啊。抛弃你队列中等待最久的任务,比如现在从上午九点等到了晚上十点,一直等吃饭,一直没有等上,那饭店就把你忘记了,觉得你不想吃饭,因为你想吃饭,不可能等这么久啊,这就是一种策略。然后除了这个之外,还有最后一种策略,这个策略什么意思呢?就是该策略,就是无法处理任务,就是不给你做任何的处理,不也不返回,异常也不做处理,就给你不做任何理睬。什么意思呢?举个例子啊。
12:00
比如现在你去你你去这个饭店吃饭,这个时候呢,你问服务员,说服务员我要吃饭,这时候服务员没人跟你说话,这时候你又喊了很多声,然后饭店没有任何人会理你,你觉得你这个人可能他不想给你处理,不想处理你的业务,因为他饭店现在已经没有能力处理了,这就叫做不做任何处理。这是我们的四种基本策略,给大家再重复一遍啊。第一个策略就是。如果说你现在超过了最大的线程数量,包括队列也满了,直接抛异常。第二个就是回到调用者运行,谁让你来的,那你去找谁。第三个就是抛弃队列中等待醉酒任务,第四个就是不做任何处理,你不管你来不来请求,那我不予理睬,不做任何处理。这就是咱们说的四种拒绝策略。所以大家把这个知道,就是现在我们要掌握两点,第一点就是线程池底层的工作流程里边的1234这些步骤是怎么做到的,然后最终还要掌握。
13:07
四种拒绝策略到底都是生判一,所以现在把这个底层的工作流程给各位就最终说完了。
我来说两句