00:00
那么再往下我们究什么呢?我们得研究一下,一个线程的一个生命周期,就是一个县城从出生到最后死亡经历了哪些过程。就是一个线程,它从出生到最后死亡经历了什么过程啊,我们来一起看一下好吧,一起看一下啊,那这块呢,我们用什么呢?用大L来描述一下。打开这个四大L啊,首先我们在这里点住这个空的工程啊,空的工程我们OK,新建一下,新建一个工程啊,新建完工程之后呢,这边呢,有一个。有个有个。安吧,安啊。算是个单元是吧,来就在这啊,有这么一个图标,点右键添加一个什么啊,模块,添加一个模块啊。那么这个模块加出来之后呢,接下来我们在这个模块下呢,加一个状态图,各位啊,状态图,这个状态图叫。呃,ADD diagram ADD diagram啊,ADD diagram加一个叫做statechart diagram啊,叫状态图。
01:05
来,我们叫线程生命周期。各位啊,县城生命周期就是县城从出生到最后死亡经历了哪些过程?来我们在这儿看一下各位啊,呃,首先呢,这个表示一个对象的一个新建。这个表示一个对象的死亡。各位啊,这个表示死亡,这个表示出生啊。然后呢?然后呢,是这样各位啊,然后是新建是出来之后啊,它会调这个star方法,会启动启动线程。启动线程。调STEM启动线程。之后呢,我们线程处于什么呀,叫做可运行状态。或者叫就绪状态啊,这是一个状态,State状态。
02:00
就绪状态。嗯。看一眼啊。看一眼这个文字怎么描述这个就绪状态是在这儿是吧,有个name这边呢。这个呢,我们叫做叫做叫做新建状态啊。新建状态能不能显示出来呀?显不出来是吧。这个状态叫新建状态,各位啊,我注释吧,我写个注释吧。行吧,写个注释啊,注释在上面吧。这啊叫新建状态。新建状态,这是一个状态啊,就是这会儿我们讲的是关于一个线程的生命周期,各位啊,我保存一下啊,保存到哪呢。我保存到课堂笔记里边吧。
03:01
我们这个呢,叫做。线程生命周期这个比较重要,各位啊,对线程的一个理解还是非常非常有帮助的。嗯。怎么他就到就绪了呢?通过这个叫做。啊,Start,各位啊,Start。他就到这个就绪状态了。那么就绪状态的线程它可以干什么呢?哎,可以抢夺CPU的时间片。CPU时间片其实就是执行权。我这画一下各位啊,写一下注释。刚扭出来的。是新建状态。刚溜出来的线程对象。啊,我们叫做新建状态,各位。
04:04
调用了大的方法。叫做调用什么呀,Start方法啊。进入什么呢?我们的一个就绪状态。什么叫就绪状态呢?来就绪状态的线程。啊,又叫做。可运行状态表示当前线程。具有什么呀,抢夺CPU执行权的权利啊。具有抢夺CPU时间片的权利。CPU时间片就是执行权啊,CPU时间片就是执行权。
05:06
这叫就绪状态,当你调用了这个start方法之后,表示就绪。又叫做可运行,表示当前线程具有抢夺CPU时间片的权利。CUCPU时间片就是执行权。啊,然后接下来呢,他抢到时间片之后,注意啊,在这里。当一个线程抢夺到CPU时间片之后。啊,就进入什么呀。运行状态。或者说就开始执行什么run方法,Run方法的开始执行。标志着线程进入运行状态。
06:05
所以这块呢,它还有一个状态叫什么呀,叫做运行状态啊运行状态。那么它从叫做就绪状态到运行状态。当然。什么表示标志着它进入运行状态呢?记住了,Run方法的开始执行表示进入运行状态。啊,这里呢,我再给大家写个注释啊。Run方法的开始执行,标志着这个线程进入运行状态。注意啊,当当之前占有的CPU时间片用完之后会。重新回到什么就绪状态,继续抢夺。
07:03
CPU时间片。当再次抢到时间片CPU时间片之后,会重新进入run方法,接着上一次的代码。继续往下执行。就往下执行。注意啊。来,往这儿错一错啊,往这儿错一下,运行乱方法的开始执行,标志着这个线程进入运行状态,当之前占有的CPU在这儿占有了,假如说一秒钟啊,在这占有了一秒钟时间片进入运行状态,一秒钟之后,这个run方法没有执行结束,此时它还会回到什么?我们的一个就绪状态,继续抢夺CPU实验片这个位置,我们叫做虚拟机的调度。
08:03
各位啊,这个位置需要我们Java虚拟机GM的调度。它频繁在这个位置到这个位置,这个位置到这个位置,这个位置到这个位置,这个位置在切换。切换啊,就当一个线程被扭出来叫新建,然后调用sla方表启动,启动进入就绪,就绪可抢夺CPU时间片,抢到时间片进入运行执行转方法,方法执行过程当中,如果时间片用完回到就绪,正在继续抢夺,再回来这个地方会接着上一次的run方法继续往下执行,听清楚啊,会接着上一次的run方法继续往下执行啊,继续往下执行好了,那什么时候就死亡了呢?等run方法执行结束标志着死亡啊,这是一个死亡状态来。这个啊,我们叫做死亡状态。在这里我加一个注释吧。啊,这是一个状态啊,叫死亡,死亡也是一种状态啊,这是现成的生命周期,那么这块呢,其实记住啊,Run方法执行结束。
09:04
Run方法执行结束啊结束。啊,乱结束。标志着进入死亡状态,大家注意听啊,注意听。那么现在呢,基本上你就可以解释解释为什么就刚才我写的这句话。有先有后,有多有少,这是咋回事?为什么说他有先有后,还有多有少呢?你看这个再再再运行一次。那上来应该是主线程抢到了CPU时间片,所以它执行了一次。执行一次之后呢,分支线程它实验片用完了呀,后来又抢实验片,是不是分支线程抢到了,分支线程执行了吧。对吧,然后是不是主线程分支线程,主线程往下走往下走往下走往下走对吧,你看到这主线程抢到了,主线程执行一次,时间片用完之后怎么办啊,分支线程就抢到了,分支线程执行一次,然后接着再往下,主线程抢间片比较多,你看主线程叭叭叭叭叭,这一次抢的时间片比较多,它的执时间片比较长,这个时候呢,它执行的机会就比较多,那么这个时候时间片用完之后怎么办呀,又抢时间片对吧?诶分支线程怎么着抢到了,抢到之后呢,他就执行,这样的话就可以给我们一种什么呀,并发的感觉嘛。
10:33
并发的感觉啊,有同学老师有没有可能存在这种情况,说主线程执行到这儿的时候,实际上时间片用完了。只不过下次再抢的时候,他可能又抢到了时间片,这种情况有没有可能?大家想一想,有没有可能?有可能吗?就是这个主线程执行到这儿,时间片用完了,回去再抢时间片的时候,再抢到了,有没有可能再抢到。有可能各位啊,有可能有可能啊。
11:02
有这个可能抢时间片,抢到之后就执行。你看,所以这1234这四个状态,哪两个状态频繁变化,各位告诉我,那线程在哪两个状态中频繁变化呀?哎,一个叫做什么呀,叫做就绪,一个叫运行啊,一个叫运行。它在就绪和运行之间频繁切换,这样的话我们多线程就可以并发了,就给人的错觉是多线程并发的。就好像这两件事在同时在做一样,听懂了吧?多线程并发是人类的一种错觉,你可以这样去理解。啊,因为计算机的处理速度非常快呀。是不是,哎,处理速度非常快,所以这个东西你得去理解它啊,去理解它,我们要的就是这种感觉嘛,对对多些人并发的这种感觉,你看有没有啊,这种感觉还是有的呀,你看运行一下。对吧,多线程并发的感觉是有的。对不对啊,会不会阻塞,这个阻塞可以忽略,这不叫阻塞啊,来我们看看有一个状态叫阻塞状态,我还没有讲到呢,这只是四个状态啊,大家注意听了啊,当我们这个线程在运行run方法的过程当中,假如说遇到了接收用户输入。
12:19
接收用户输入的这种情况,大家知道我们之前写过一个代码叫什么呀,叫做scanner是不是,哎叫做scanner scanner,然后呢,我们这个scanner调一个方法叫next,只要这个方法一执行,是不是就卡住了。那如果是run方法执行过程当中遇到了这个代码呢,这个代码一执行它会怎么做呢?诶注意了啊,这个时候线程会进入一个什么呀,阻塞状态。阻塞状态啊,一看这就是学过的,来,我们看一下啊,把这个叫做state state拿过来,这个叫做阻塞状态。
13:00
那么这个阻塞状态是由我们的一个运行状态变过去的,所以这块呢,我们画一下啊。来一下啊。这个这是遇到什么呀,阻塞事件,遇到阻塞事件。当你遇到阻塞事件的时候,进入阻塞状态,记住啊,来这块呢,我往下拖一下。进入阻塞状态的线程会放弃当前占有的CPU时间片。啊,就你将你你比如说你拿到一分钟的执行权利,你叭叭叭叭执行啪阻塞了,这个时候你把手里的一分钟怎么着释放掉啊,会把手里的一分钟释放掉,各位啊,我强调一下。当一个线程遇到阻塞事件,例如接收什么呀?用户键盘输入。
14:08
或者sleep方法等。此时线程会进入。阻塞状态,阻塞状态的线程会放弃之前占有的什么时CPU时间片。是因为出现异常才出现这种问题吗?不是啊。不是出现异常啊,这不算出异常啊,这就是正常代码执行啊。当一个线程遇到阻塞事件呀,例如接收用户键盘输入。会卡到这不动吗?或者sleep方法对不对?当此时线程会进入阻塞状态啊,阻塞状态线程会放弃之前占用的CPU实验片。啊,那将来。其实你这个道理很简单,比如说厕所的一个例子,对吧,叫站着什么不不什么还记得吗?
15:05
有这个说法吗?怎么说来那句话?叫占着茅坑不拉屎是吧?哎。站在门口,门口你肯定是这样啊,你这块你把这个叫什么,这个这个这个时间片,你你站着干啥呀,你都阻塞了,你都没有办法执行了。对不对,哎,所以说你肯定会把手里占的这个时间片给他,给他给给他释放掉,你你这是资源呀,你得让给别的县城用啊,别的县城有可能还会用啊。对不对,哎,对不对,那阻塞有没有可能解除什么意思。有没有可能就是说我们用户在这接收输入对吧,然后用户在这输进去了。他输完之后,这行代码是不是就结束了。
16:00
这一行代码执行结束之后怎么办呀?哎,它会马上马上进入运行状态吗?从阻塞状态会直接进到运行状态吗?不会啊,因为它没有时间片,它得回到就绪状态,继续抢夺CPU时间片,明白吗?这叫阻塞解除。阻塞解除,各位啊,当阻塞解除之后会进入就绪状态,抢夺CPU时间片,因为之前的时间片它给释放掉了。啊,之前的时间已经没了。明白吧,在这里呢,我要给大家标一下啊。之前的时间片没了。需要什么呀?再次回到就绪状态。抢夺CPU时间片。明白吧,哎,是这样一个情况啊。
17:04
好了,那这个呢,就是关于我们现成的一个生命周期,从出生到死亡经历,一共有五个状态啊,有五个状态,新建状态,就绪状态,运行状态,阻塞状态和死亡状态。又要重新开始排队,再来抢实验片,对,抢实验片啊,但是抢完实验片会接着上一次进入运行状态的话,会接着上一次的那个run方法继续往下执行。会接着上一次的run方法继续往下执行,它不会重新执行run方法啊,不会从零开始重新执行run方法,它会接着上一次的run方法继续往下执行的啊,继续往下执行的。行了,那么这一块呢,最主要呢,是给大家聊一聊一个现成的生命周期,各位啊。关于线程对象的生命周期。新建状态必须背会啊,这个面试会问的新建状态,就绪状态,运行状态,阻塞状态,死亡状态啊,死亡状态。
18:12
如果你对一个现成的生命周期了解的很透彻,那么你就知道我们这个程序它的执行为什么是这样一个德行呢?啊,为什么我们这个程序是这样的?对,为什么是这样的一个结果。啊,它原因是什么,对吧,你应该能够理解它为什么是这样的。为什么就并发了,对不对啊,这个还是很重要的啊,还是很重要的,嗯,好了,这是关于这个现成的一个生命周期吧,那咱们就说这么多吧,行吧。
我来说两句