00:00
好,同学们,通过前面的案例,也就是我们这个运行300次啊,得到的结论,线程的中断状态设置为错,不会停止线场,给大家进行过详细的讲解,那接下来。这道题还没完,还有一个后手案例非常重要,念的就是它,哎,这块的话,真的涉及到的底层原理啊,不说清楚,可能你别说搞懂,可能你都不会发现有这么一个暗门来。在玩它之前,我们再来读一段这个,上面这个我们前一个案例给大家已经证明过了,下面大家请看。如果县城处于被阻塞状态。例如调用sleep wait救援等等方法。在别的线程中调用当前线程对象的interrupt方法,那么线程将立刻退出被阻塞的状态,并抛出一个。Interrupted exception异常好。那这段有什么意思呢?我相信读完这段中文文字以后,或多或少你还是有点糊里糊涂的,那么接下来我们呢,心起炉灶,再建一个类,看哔哩哔哩还是同样的包,下面我们呢啊?
01:13
后二再进一个升级,说说这个重要的后手案例,那么就立刻完成这道题目的全面认知。好,同学们请跟着我来。那么换以前大家呢,嗯,都清楚。我们这个是一个T。记忆start。那么我们这儿呢,已经讲了很多次了啊,就不再多废话,那么在这儿。我们呢,直接来做一个判断。如果说。当前线程,也就是GE is interrupted,它是中断标志位是处的话,那么代表。我这个线程我现在。相当于说我们的中段标志位。
02:03
那么现在这个值二是多少?是不是应该是?我们的错,然后完了以后。在这块获得的效果是不是?程序。停止,同学们,我相信这一行代码大家都没有任何问题,如果程序停止了,我们呢?Break,离开我们当前的。判断好,那么假设它的中断标志位。不是错,是副这段不进来,那么它呢。乐呵呵的,屁颠屁颠的。打印我们对应的业务逻辑啊,比如说我们这个呢,就是interrupt demo03好,那么我相信这个呢,是大家非常熟悉的。好,那么现在呢?我就一秒钟,一秒钟以后我们的T2上来了,那我们的T2的作用呢。是干这么个事儿。相当于。
03:01
和T协商。哥们儿,请把手上的烟掐灭。对吧,那么T1INTERRUPT t2对T线程调用,调用了interrupt方法,我想对你进行一个。中断标志位的申请,将你从默认的false设置为错,同学们,没问题吧?如果一秒钟以后,T2对T1的中断标志位设置为错,这一块立刻检测到,那么。打印出来程序停止break,离开我们的程序没问题吧,好,那么在这一块以后我们呢。给答案呢?详细讲解过欧了,先把上一讲的case啊复习一下,那么来,同学们请看,此时灯已灭,第一中段标志位是错程序必须要停止,我的业务逻辑,我写了这段,我愿意配合你,OKT2跟你说,请中断一下,好,交警找到你了,哥们,靠边停车,你配合一下,配合一下交警靠边停车了,对吧?好了,这个不废话。
04:03
再跑一次。我们可以正确的看到,此时只要是中断,T1的中断标志位被设置为错,在这块检测到它是错的话,程序就应该正确停止,而且这个灯会灭,程序正常结束,OK,挺和谐的好。那么下面同学们我们改造一下程序。我们呢,TH让他睡一会儿,Sleep,比方说两百两百毫秒对吧,我们在这呢。就把这加了一这么一小段,间隔200毫秒睡眠一下这么一个操作,那么再来跑一下我们的程序再看一下。只要这个中断标志位是错,程序还能不能正常停止?好,那么同学们,我们跑一下。一秒钟以后,T2对T1调用interrupt,好,同学们可以看得出报了一个异常。那么这个异常是sleep interrupted OK,那么主要是interrupt。
05:02
Exception,没问题吧,报了这么一个睡眠中断的一个异常,好,可问题是你报异常这是为什么?第二个有没有发现这个灯并没有灭,有没有发现我们的程序在不停的打印着,好,我们先把它清除一些。什么一个情况,非常可怕的一个现象产生了,死循环程序根本停不下来,大家看灯没灭。这个时候就很懵逼了,我就加了这么一个。睡眠200毫秒的这么一段代码,怎么会导致这么严重的故障?大家请看清空里和后台源源不断的。产生了无限循环,好,那么请问这又是为什么?那么接下来我们应该怎么解决这个问题呢?我们先把它。关闭,现在我们已经知道了,我们就加了这么一个动作,我们呢想间隔一下时间,然后再来执行,可是没想到当我具备这段代码的时候,调用了T1INTERR的方法,居然会爆出了一个中断的异常,且还会导致程序无限循环,这是非常可怕的事儿,对吧?那么好,故障现象我们明白了,那么导致原因呢,我们。
06:15
过一会儿再分析,那么接下来先解决该怎么办,我们期望的就是就算你报异常也好,或者怎么着,起码我这个中断标志位是处的时候,你程序是不是应该break停下来中断啊,给我stop停下来。那么接下来看着。如果你产生这样的一个interrupted exception异常。导致程序无限循环。那么这个时候请你在TH点。看着所有的这当前线程,就T1站,再调一次interrupt,将程序的中断标志位再次设为true。OK,好,那么同学们,我们来看一下。用这个方法来解决,可不可以来同学们?
07:03
那么我们。强强调了故障现象,那么现在先找事解决方案,然后待会来说分析这个原因。各位同学请看怎么着,报没报异常报了,但是程序中断标志为错,程序停止了,就没有搞出无限循环这样恐怖的情况,OK,好,所以说难点和考点在这儿。那么。就是为什么。要在异常处。在。要用一次。好,以及整体的故障现象,来,我们来进行一个底层原理的分析,这个是考点,是重点,也是难点,请大家务必集中精神跟着来。首先。我们回到我们原来说过的这段话。能理解了吧?如果你还是不能理解,那么这儿我们来回到我们的API,我原来是不是说过这段话,上一讲我们讲过,现在咱们这儿是不是还有这一段话。
08:05
他说如果该形成阻塞的调用了这堆堆堆堆的方法,什么wait呀,就音啊等等等等,注意看这是不是有个sleep啊,那么这个类的方法,那么它的中断状态怎么着。将被清除,也即你处那个状态将会被清除,变成force,并且将会收到interrupted exception,前面我们都看到过了吧,那么这个时候呢?它情况是这样的。来,同学们,我们做一下这个思路的整理。第一步我们都晓得,但没有调用interrupt之前,那么这个时候。中断标志位默认是false,第一步没问题吧,那么一秒钟以后,T2。线程T2。对线程T1。发出了。
09:00
中断协商,然后呢,调用也记我们的T2,调用T1INTERRUPTED。OK,那么此时我们的中断标志位。它应该变成什么处?那么现在第三步按照正常情况,如果这个为触了中断标志位为处。那么就是我们前面所说的。程序停止,OK,那么皆大欢喜。但是现在中段标准为出,碰上了我们的一个什么interrupted exception。那么就是我们的。异常情况OK,暴露出来了,他意思是什么呢?我基本上如果在这块不进来,那么我现在正常的话,是不是每间隔200毫秒我来打印这么一句话,每间隔200毫秒我来打印这么一句话,我在正常执行的时候,突然有人给我调用了interrupt异常,那么将会报一个中断的异常,OK,我T1在这块在用着点。
10:09
根据我们文档上在用这些方法的时候,那么抱歉这个类的方法,那么它的中断状态将会被什么清除?所以说我这儿暂停200毫秒的时候,突然有人对我调用了interrupt,可不是把我的中断。这个状态破功了,破防了,那么所以说这个时候我会报这么一个exception,那么此时我们的终端标志为错,异常情况碰上这个,那么将会把我们的。中断状态将被清除,并且爆出这么一个异常,那么此时中断标志位又变成了什么?负12,那么。导致无限循环,OK,没问题吧。所以说最终第五步在。看你。
11:01
块中需要再次。A中段标识位。设置为错,那么就是二次调用。停止程序才OK。明白了吗?所以说同学们在这块,这就是为什么我们要在异常处再调用一次啊,因为。每间隔200毫秒执行的时候,突然有人调用interrupt方法,根据我们的语法规则,这个时候中断状态将会被清除,并且受到interrupted exception,那不好意思啊,我这就执行它,那么这个时候程序将会导致无限循环,哎,这个就是我们最麻烦的地方,所以说呢,这就是我们案例的后手,来吧,我们呢,来看一下我们的结论。第一个没有它程序是不会停止的,中断不打断,看看sleep的方法的源码,再给大家呢进行一下讲解,那这是什么意思呢?同学们,我们呢,来看一下这个源码,我们的interrupt方法,OK。
12:06
点进来看看上面,他这说的很清晰,那么比如说我们在调用这些方法的时候,包括这个sleep啊等等等等,Then,它的中断的状态将会be,将会被什么,Will be。Clear的被清除,并且他将会收到一个interrupted exception和我们笔记上的这一段是一模一样的明白,所以说你在这儿调用的时候,假设。属于这个方法,或者sleep被人又突然执行了interrupt方法,那么就会抛出这个异常,导致中断标识位复位,重新变成force啊,那么变成false以后可不是人家又继续无限循环打印出来,OK,好,那么所以说请各位同学一定要注意,那么得到我们的结论就是说sleep方法抛出interrupted exception后中断标书。被清空且被重置为false啊,那么一重置为false了以后,同学们晓得,那么我们这块是不是又开始了外交处啊,无限循环啊,哎,因为false这是不是不进来呀,那么所以说他只好又在这儿干循环。
13:14
我们在catch块中没有通过这个方法再次将中断标志为设置为错,这就导致什么无限循环了。哎,所以说请同学们这一块是非常重要的,那么接下来我们可以获得我们的结论,中断只是一种协商机制,修改中断标识位仅此而已,不是立刻stop打断,不是立刻stop now OK,好,那么同学们对第二题的讲解和分享,我们就给大家说到。
我来说两句