00:00
好,咱们来看一下,这个呢叫线程的调度啊,这呢涉及到线程的一个优先级的一个设置啊呃,什么叫线程的调度呢?就是我们呢,这个创建的多个线程,然后被CPU执行的时候呢,涉及到CPU的一个调度的策略,嗯,正常来讲,这个CPU呢,采用的这个叫呃时间片的方式,就是呢切换呃执行一块执行一段这个的线程,然后执行一段另外的一个线程,这就叫时间片的方式啊那除了这种之外呢,还提到一个叫做抢占式,什么叫抢占式呢?就是如果我们在程序当中呢,创建了多个线程,那这个线程呢,我们可以设置它的优先级,那么高优先级的呢,它要抢占这个低优先级的这个CPU资源,也就是说呢,这个CPU呢,在切换的时候呢,它会优先的考虑这个高优先级的现场,呃,就是这样个情况啊,就好比是大家你去这个呃银行的时候啊,呃这个尤其是去这个工行,发现这个体验就不特别好啊,工行的这个人比较多啊,而且大部分都是。
01:00
老爷子老太太是吧,可能是好多这个这个公积金啊什么的,他可能都是在工行办的啊,你去这个工行的时候呢,你就发现经常一等等很长时间在前面呢,他会有这个这个窗口这块呢,有这个呃液晶屏啊,比如说它有的,呃,它有好几种叫法啊,比如从这个A开头的,比如A101啊A102啊啊他一会儿又整了什么什么T开头的,你会发现呢,他并不是说呢,叫一个A就叫个T啊,有可能人家这个呢优先级要高,他能连着叫好几个T,然后呢,诶叫回一个A,然后呢,叫一个A以后呢,又连着叫好几个T啊,那很显然这个T这块开头的,你可以也看成是这是一个线程是一个线程一样啊,它的优先级就要高一些啊,就相当于这个意思一样啊嗯,这个尤其像这个银行以前呢,现在好像是没了啊,或者现在好像也有,但是呢,就是跟正常的柜台呢,就分开了,以前有一个专门那个柜台,就是专门叫VIP客户是吧,就是你要是这个在银行存款比较多的时候呢,你去银行办理业务,前面说白了你就可以插队一样。
02:00
啊,你你可能刚一来,然后马上呢就去服务了,其他人可能都等了俩小时了啊,那也得等着是吧,哎,这就是高于这个什么VIP客户的一些特权啊,其实我我当时挺反感的,因为我是非VIP的是吧,啊就是他这个VIP呢,确实这个享受一些比较好的一些这个措施可以理解,但是呢,你不能是建立在现有的这些人是吧,其实你把现有这些人的这个一些好的东西呢,给给相当于给卖了,卖给那些人啊,让他们快速的去享受这个服务是吧,你可以额外的给人家做的做的好一点啊,倒杯水啊这个无所谓,这个我不关心是吧,但是你不能抢占我的这个非VIP的这样的一些这个这个享受的这个服务是吧,后来的话呢,好像也有,只不过呢,就是不是跟这个非VIP的都在一起了,就整到一个里边的屋里边,这样你就看不见了是吧,你看不见心里边就好多了啊啊诶这呢,就提到一个这个优先级不一样这样。
03:00
先级啊,这里边儿就提到这个高优先级的呢,它要抢占这个低优先级的这样一个策略啊,那我们可以给这个县城呢去设置优先级,那现在的优先级呢,我们这里呢,提到了有三个常量,第一个呢叫max priority,所以最大的一个优先级是十,最小的优先级呢是一是用整数来表示的,那通常normal就正常情况下呢,默认优先级是五啊那原I级呢,我们这个线程的优先级呢,一共是有这十档。诶,默认情况下是这个五这一档,咱们呢,可以通过调一个方法叫get priority来看一下咱们当前线程的先级,也可以通过呢叫set prior OT呢来设置当前线程的优先级,好,那我们回过到代码这个层面呢,说明一下啊,这是咱们说的叫诶线程的优先级啊优先级呃,刚才咱们说的第一个问题就是呃长就是我们整个县城的优先级呢,一共设计成了十档啊,涉及了这样的几个常量,这个我们直接呢就粘过来了。
04:07
看谁知道涉及到呢这样的,呃,三个这个常量啊,这三个常量呢,是直接定义在咱们这个re类当中的。看类当中,你打开这个RI类,然后我们这时候呢,Ctrl o一下看你写一个叫max,哎,这个priority啊点开这就是max的,这是normal的,然后这是mid,这是这样的三个常量啊好,然后接下来主要呢,咱们要说的是如何来获取和设置啊,哎设置哎当前线程的优先。及啊这呢,我们就提到了,叫一个呢,叫get,哎,Priority。哎,这个呢叫set一下priority,这里边呢,你可以写一个int型的一个ity,哎,这个priority啊这样就可以了,那这呢是一个叫获取。
05:06
哎,这个呢叫设置。好,那这块呢,咱们来这个演示一下啊,首先呢,咱们来获取一下咱们当前线程的优先级,比如说呢这呢,咱们是这个分线程获取了名字,在这个名字的后面,我这呢来一个加号,诶我们再接着呢叫thread.current thread.get一下它的叫priority,哎,然后我们再加上一个这个括号啊。好,这是这个事儿,然后呢,关于咱们这个主线程,主线程在这里咱们也给大加一下,哎,这呢直接也是啊thread第2CURRENT thread点啊get一下叫priority。哎,这样子就OK了啊呃,下面这块呢,咱们是一定得这样写的,上面我只是呃,顺便也这样去写了,其实我们要把这个干掉行不行。是不是也可以啊,哎,这个organ get name是不是这样也行,哎,因为你本身当前这不就是一个在线程这个类里边的嘛,是吧?哎,所以可以直接这样去写啊,但你要加上的话呢,可能就更清楚一些啊,这个都可以啊,然后此时呢,我们先执行一下,在我们没有设置之前,我们会发现呢,咱们的主线程,哎,咱们的这个哎分线程都是默认的优先级啊,这就咱们所谓的这个叫normal normal啊,这是默认的优先级。
06:32
行,那么我们也可以呢去给他修改,那修改的话呢,这个你对于分县程来讲,最好在start之前去修改了,要不人家都已经跑出去了,你再去修改就晚了啊,所以在这个位置我们呢可以去设置。啊,这个呃,分线程的优先级。哎,这个我们直接通过这个he去调一下啊,叫set priority,比如说呢,我们给它设置成最大的这个你写十也可以,但这时候有的时候感觉就莫名其妙的啊,哎,你要是写十的话呢,不如呢,你就写一个叫哎max priority。
07:11
啊,当然你要写八呀七呀,那就只能是写一个具体的数了,这呢我把它的优先级呢,调的比较高啊,它调的比较高,咱们这个主线程的我没有调,或者你也可以调一下,把它调成最低的也行。嗯,他去晒一下priority,我改成一下叫thread,第二啊叫mean priority啊这块咱们把这个join这块呢先干掉啊。哎,就是演示一下这个我们就不操作它了,成,那么这个时候呢,大家看一下啊,我把咱们的这个分线程把它的优先级调的比较高,把咱们这个主线程的优先级调的比较低,呃,我们看下什么呢?呃,是不是我们这个分线程它所有的都打印完以后,我们这个主线程呢,才开始哎去打印这个零。
08:08
啊,结束了,哎,很显然不是啊,你看这块分线程调的优先级比较高,你看它反而到后边,你看主线程反而到炮前面了,诶还很夸张,你看啊。主线程反而是最先执行完的啊。是吧,我这有什么其他的逻辑不对吗?也没啥是吧,这个其实也没啥用啊,这个我们给大家也注释一下,这呢是咱们写的一个主线程,呃,设置一些优先级别的也没啥了哦,Sleep咱们有这个sleep,所以你这块一睡呢,那肯定这个主线呢是要快一些的是吧,把这个呢,咱们也注射掉啊,此时的话呢,他们两个都没有这个休眠也没有阻塞的影响,就是单纯的去看一下他俩这个,哎这个谁先谁后啊,哎,我们执行一下啊,这时候呢,哎就能看到一些这个交互的情况了,那通过这个交互情况呢,我们也看到哈,并不是说呢,我们这个分线程的优先级高啊,它就从零一直到98出来完以后,我们的这个主线程才开始执行的啊,你会发现呢,它们其实也有交互,反而呢,你看这时候这个分线程还跑到后边了啊,那你再执行,这就相当于是一个巧合了啊,再执行,哎这块呢,可能就又混乱了,就是从那个多次执行的这个概率上来讲,我们只能说呢这个。
09:39
分线程设置的优先级呢,比较高,比较高的话呢,它就是从概率上来讲,它就有可能优先会被CPU呢执行,但是并不一定说一定会被执行啊,并不是说一定会被执行,比如说呢,你做一件事情说这个啊,概率呢是98%啊,这也不是说呢,你百分之百一定会成,说你能考到北大的概率是98%。
10:05
啊只能说呢,诶不错是吧,概率很高,当然呢,也有可能就执行到2%了,所以这只是一个概率的问题啊,啊所以经常咱们这个普通人的话呢,呃,如果要告诉你说呢,你中彩票的概率呢,是0.1%,哎你总感觉自己甚至0.1%是吧,就去买彩票,那如果说呢,你出门这个呃出现危险啊,交通事故的概率呢,可能是0.01%,你就总觉得自己可能就是那0.01%啊不是你你会总觉得说自己,呃不会出现这0.01%是吧?啊就是总往好处去想哈,就这里边呢,我们只能说这个优先级比较高的这个线程,从概率上来讲,它啊是可能啊这个高概率被CPU呢执行到,当然也并不意味着说只有说优先级高的执行完以后,优先级低的才执行啊,这个大家要注意啊,这个我们在这说明一下。
11:00
啊,高优先级啊,在这个县城啊,要抢占啊这个低优先级啊,县城这个CPU的这个执行权啊,但是啊,只是从概率上来讲。呃,讲这个,呃,概率上讲的高优先级的线程呢,要啊这个高概率的情况下被执行。嗯,高概率的情况看一下哎被执行,哎并不意味着。哎,并不,哎意味着啊,只有当这个高优先级的。呃,线程执行完以后,哎,低优先级的线程才执行。
12:00
哎,这个大家要注意一下就行了啊行,这呢是咱们说这个叫线程的一个优先级的设置的问题。
我来说两句