00:00
那按照咱们这个知识的顺序呢,下边咱们提一下叫现成的生命周期。哎,这个咱们复习的时候也提到了,这个生命周期是咱们算第一次正式的提出这样的一个词,就是某一个结构,从他的出生到他的消亡,这个过程就称作一个生命周期,那对于我们个人来讲也是一样,从家呢,从大家呢,出生的这一天开始,一直到你最后离开的这一天,是吧,整个这个过程当中,这个你你会有各种各样的状态啊,调用各种各样的功能和方法,是吧?哎,这个都算是一个人的生命周期了,那么对于一个线程来讲,我们看下它的生命周期,首先呢,我们提到呢,它有几种状态,这几种状态呢,它定义在哪呢?定义在咱们re的内部有一个类,就是一个内部类,这个内部类呢叫做state。啊,就是状态的意思,那么这个内部的stay的类呢,就记录了我们这个thread呢,几种生命周期状态,我们可以来这看一下,嗯,大家呢,Ctrl shift t这咱不都统一这个这个快捷键了,大家去输入这个叫thread,你这时候一输入没有,你把这个勾呢勾一下,这呢就调一下我们这个JDK里边的源码了,啊好点击进来,进来以后呢,你ctrl o一下这个,你就找这个叫state。
01:21
看这就是它内部的一个类,好双击打开,双击打不开点一下吧,这样就开了啊那么这个呢,就是我们内部的一个类,大家可能说诶这怎么是个类吗?对,这是咱们这一章,嗯,第二部分的,这要讲一个枚举类,其实呢,比较简单,这就是枚举类啊这个这个你先暂时呢,把它先理解成就是个class就可以了啊这个state定义了它现成的多个状态下边呢,哎,这几个你看似呢,就是一看这个大大写的肯定是一个常量了,对吧,这其实是咱们这个state这个类的几个对象。
02:02
哎,几个对象,这个咱们讲到枚举类的时候呢,再说那么这几个对象呢,就定义了我们现成的几种状态,第一个new。就是刚创建呗,咱们呢,在代码当中,随便咱们找集成或者实现都可以,咱们这个相当于是不是就是new了,是不是造出来了,对吧,这时候呢,你造出来以后,注意还没有started,还没有调这个star方法呢,啊这叫new,然后下面一个呢叫reable。Renoable是不是就执行起来了,这个线程呢就跑起来了,嗯,当你调完四大的方法以后呢,CPU开始给它分配资源了啊,这叫reable了,然后边呢,还有叫blocked block阻塞,嗯,Blocked还有一个呢叫啊waiting,还有一个呢叫time的waiting,它这呢是涉及到的一些方法,呃,一些方法的调用,比如说这个后边咱们讲通信的时候有wait方法,当你调这个带参数的这种wait的时候呢,叫,呃有有指定时间的一个waiting,然后呢,你要是调的那种空参的呢,空参的这个weight呢,它就叫做这个waiting了。呃,然后呢,Block呢,就是说这个这个你还没有进入这个同步结构的时候呢,叫做block,这个我现在说大家可能有点迷糊哈,你就简单先听一下,然后呢,后边还有一个呢,叫它。
03:21
这个就涉及到就差不多就结束了啊,生命周期就完结了,死亡了,这样的一种状态,他这里边呢,分的比较细致,通过几个方法来描述的,咱们这块呢,重新的给它调整一下,哎,通过我这样重新定义的一种方式呢,大家可能更好理解,我这呢,把这个线程呢,分成了五种状态,哎,你可以按照我这个来,它这几种几种状态呢,就是按照方法来分的啊,就是不是很清晰了,这个你看我这个可能更清晰一些,首先呢,我们把这个线程呢,提中提出一种状态叫做新建,相当于刚才它那里边的new啊,当你造完这个线程,这就叫新建了,就绪呢,就是我们调star方法以后,它就就绪了,这个时候你不能说它是运行啊。
04:07
因为咱们掉了start,不是说你一调start马上就开始执行,你CPU可能现在干别的事呢啊,所以这时候呢,你只能说你现在是就绪了,就是CPU只要你执行我我就可以跑起来啊,一旦呢,CPU给你分配资源了,你就运行了。那运行完以后,我都该干的事都做完了,那你就死亡了啊,那么在运行和死亡之间呢,是有可能会出现阻塞的,阻塞就这时候呢,嗯,你说你死呃死了吗?没死还没执行完呢,当然呢,CPU现在又没有执行,你这个时候呢,就算是一种阻塞状态啊,就这个意思啊呃,当然这个阻塞呢,跟这个就绪是有区别的啊,这个阻塞呢,就是说比如咱们这个讲这个常用方法里边提到过那个join John的时候呢,就是CPU呢,可能也想去这个这个操作你,但是这时候呢,操作你也操作不了,谁让你掉join了啊,你得把那个线程执行完,你才能够接着跑啊,这叫阻塞了啊嗯,这个呃还不是说呢,这个你现在运行着,然后呢,突然CPU不执行你了,只是切换到别的线程,那个呢,还不能叫阻塞了,应该又又回到就绪了,相当于是啊,呃,这样说呢,可能大家稍微有一个大概的理解了,但是还是有一点不清晰,那咱们呢,就画一个图,其实我这已经画了一个图了啊,这个我们。
05:23
再重新画一个,刚才呢提到几种状态。呃,先写一个这个话吧,叫现成的生命周期。行,然后呢,我们整几个这个小框。嗯,第一种状态叫什么新念这个你别刚才我说完以后,你听一听就完事了,这几个状态你得记住啊。明天就需要画新建,新建完以后呢,就就去了,对运行,然后下一个就要运行,呃,运行,然后运行,然后呢,过程当中呢,是有可能阻塞的,这我写一个阻塞啊,这个运行啊,正常的执行完了。
06:19
死亡了成这就是这样的几个状态,那这几个状态呢,是其中大家需要掌握的第一个点,第二点呢,就是你要关注一下哪些操作会导致从一个状态切换到另一个状态,比如说新建,新建的到就绪,对新建的就是咱们new完,哎就是这个操作了,哎这是实现的方式啊,就是你这块new一个thread,你要继承的方式呢,就是new一个你自己这个thad的子类对象,这呢叫心念,新建完以后,我们如何让它就绪呢?是不是调用的方法呀,字小一点。
07:07
调用start以后,这个要清楚,并不是说我们调用了start它就马上运行了,这要注意一下,就好比是好比是什么呢?比如说咱们在这个继承的方式当中,我调了一下T1的start,调到T2的start,那么我问一句哈,你说我这个start的方法,这个T1跟T2是不是一定是T1先被start呀,是吧,就是这个方法的调用是他先吧,对,那肯定是啊,你你这四行代码咱们是不是都是在这个主线程当中帮你做的呀?诶所以说你主线程这个线性,呃,这个顺序执行呗,那肯定是他先被start,就相当于他先被启动了,但是呢,我们如果输出你看这个在这看了,你输出你看这个结果的话呢,不一定这个T1先输出的这个零是吧,有可能是不是T2先输出零啊,诶,虽然你先被启动了,但是呢,你没有先被CPU执行。
08:07
是家T2先了,这个是有可能的,这就相当于是我们先是有一个就绪状态啊,你就绪完以后呢,CPU不一定就执行你了啊,那其实我们也就说清楚了,从就绪到运行这个中间是做了什么事。哎,就相当于是不是这个,呃,你你你要是从线程的角度说啊,CPU这个线程去抢那个CPU资源了,实际上不是抢的是我们CPU主动是不是给他分配这个资源去执行了,哎对,哎,那我们这想叫获取了这个呃,CPU的一个执行权啊嗯,你获取这个执行权的话呢,这时候呢,你就开始去运行了,那么从这个运行能回到旧区吗?可以的,我这时候分配到你,你就执行,那么分配了一会儿以后,是不是我就还有别的县程要去做了,我就开始给别的县城了,所以这时候呢,你就相当于又失去这个执行权了,这时候失去这个执行权呢,不是阻塞啊。
09:06
只是你又回到这个就绪了,最后再分配到你再执行,哎,所以这呢是从运行到就绪。啊,对应的获取那个就要失去哎,CPU的执行权。嗯,那这呢是其中的一种情况,然后咱们呢,讲现成的这个方法的时候呢,还提到了一个叫做诶I的这个方法。哎,咱们一调业务的,你这个线程是不是他就主动的把这个CPU的执行权就给释放了是吧?哎,然后呢,相当于就他就进入就绪了,只不过有可能下一刻的话呢,是不是他又过去了。哎,是这样的成,所以这呢是有一个反复可以这样的,这个这个这个过去也可以回来的,那么我们先往这块说啊,这个正常运行运行,然后最后的一个结果是死亡。
10:00
死亡还能往回返吗?那死死亡再往回返正死而复生了是吧?那挺吓人的啊,这就不行了,哎,就是这个线程呢,你就只能这个你你start的话呢,这只能是它从头到尾这一次就算完事了啊,就死亡了,那么从运行到死亡都有哪些情况呢?那最典型的就是是不是执行完你这个run方法呀。哎,这是一种情况了哈,还有别的吗?对,咱们呢,讲这个方法的时候呢,虽然没有演示,但说了一下,有一个方法叫做stop。调用现成的,诶stop方法,这个stop呢,就是你这个run可能没执行完,但是我一调stop呢,强制让我们这个线程就死亡了。啊,就相当于比如说这个上帝一样是吧,看着你在这干了很多坏事,你还没有到你这个这个这个老死的那个年龄了是吧,但是强制的话呢,让你stop一下立马就挂了是吧?哎,只要stop了啊,那个小一点,那还有别的情况吗?
11:13
对,我们呢,可能会出现异常,哎,这个有的时候异常,有的还有这个error啊出现叫error,或者呢,是exception的时候出现这个,然后呢,且没处理是吧,你要处理的话呢,那就又没事了啊,就相当于这个人呢,可能会生病嘛,就相当于出现异常了,生病了你还不治,你要治了也行,治了就好了是吧,你又不治,不治了那不就。也就死亡了是吧,哎,这是三种典型的从运行到死亡的这个情况,哎,这个大家注意一下,不能回来啊,这个不能回来,这个没有这个这个是死而复生这种药啊,那么还有一种状态呢,叫做阻塞。阻塞呢,就是这时候呢,这个县城呢啥也干不了,西部呢想适应它也不行,它跟这个旧绪状态大家要区分开,嗯,那么咱们要关注都有哪些情况呢?会导致咱们现在是运行着呢,运行着突然这时候呢,想执行也不行了,这个就叫做阻塞了,那阻塞阻塞注意它一定不是我们一个线程的最终状态啊。
12:22
如果你这个线程呃,新建了,然后呢,始终在这阻塞着,始终这个这个不能跑成这运行啊,始终回不来,这个是有问题的啊,现在这个程序呢,就结束不了了啊,县城的一个最终状态是不是只能有一个呀,死亡那相当于大家从出生的第一天开始就注定了你的最终目的就只有一个,就是去死是吧?啊,就认识你唯一的一个出路啊,没有别的啊,这个阻塞呢,不是一种状态,你想把自己说冷冻起来,然后我就也没死,你要是死的话没死活着嘛,现在也也没没有正常活着是吧?哎,这个是一种阻塞状态,这不是一种最终状态啊,最终状态一定是死啊,哎,这个呢,我们就从这个这个注意阻塞的话呢,不能马上就回到运行。
13:11
啊,阻塞的时候呢,你得先就绪哈,就绪了,然后接下来CPU给你执行权了,你才能运行,所以得这样啊,那我们需要关注的就是哪些操作会使得我们一个线程从运行到阻塞跑的好好的,突然现在阻塞了,CPU想执行也执行不了,对咱们讲过一些方法了,嗯,这个对,是不是有这个sleep呀,Sleep咱们里边会设置一个时间是吧?呃,这个呢,有一个我写一个什么,写一个这个简单的一个time吧,浪型的。哎,这呢有一个sleep的这个方法,当我们一定这个先成的sleep,这时候呢,它就阻塞了,这时候叫阻塞啊,在这个你睡眠呢,比如说一分钟这个过程当中,CPU想执行你也没戏啊,这叫阻塞,还有什么呢?对大家提到这个John。
14:10
嗯,这个join,当我们在这个A线程当中调B线程点join谁阻塞了,对A对A阻塞了啊,A阻塞了,这时候人家B还没执行完,这是A,这是永远不可能执行的啊,CPU想执行也不行啊,这叫阻塞啊,那么还有哪些,还有一些呢,咱们呃没有详细的去讲,或者呢,还没有讲的,比如说呢,哎,咱们马上一会要说的叫同步啊,哎,等待同步锁。呃,等待同步锁,这个咱们先写上啊,一会儿呢,咱们再详细的说,就未来呢,我们要处理一个线程的安全问题,多个线程都想去操作,共享数据,这个我们只让一个操作,其他的都等着,其他等着的那些呢,就理解为就是都在等待同步锁啊,这是他,然后呢,咱们讲这个通信的时候呢,还会提到一个叫做wait的方法。
15:07
哎,我们调一个线程的wait,你看这个名也知道,它就等待了啊,那你就在这等着啊,等着呢,这个状态呢,也成为叫做阻塞啊,嗯,还有什么呢,我们后边会讲一个,呃,不是后边了,这个也是一个被过时的方法啊,这个我只是把它写出来叫supend spend,在我们的API当中。Thad,哎,我们呢,有一个方法叫做pend,开头在这呢,哎,不知道啊,SUSUU在下边了,这嗯,这个surfacepend呢,它的意思呢就是叫挂起,就把这个线程的挂起,就是这个线程本来好好这样是执行,现在我不想让它执行了,先等一会儿啊,我就把它挂起来,这叫挂起的状态,这个呢,为什么被depared呢,就它可能会导致这个死锁啊,什么是死锁,咱们一会说这个,所以说呢,呃,这个我们不用它了啊,当然呢,至少你也知道调这个方法的时候呢,也会出现阻塞。
16:15
啊,也会出现这个阻塞行,这呢,就是咱们这个说到的啊,从这个运行到阻塞的这样的几个操作。那么咱们刚才也提到了,阻塞呢,一定不是一个现成的最终状态,最终状态一定得这个从阻塞再回到这个就绪啊,啊最终呢一定是死,然后这块呢,我们就得有一有一些这个情况是出现了一个阻塞到就绪的啊,那对应的咱们去写第一个呢,就是你这个sleep的时间到时间到。嗯,Sleep呢,你有一个时间啊,比如说一分钟,当你这一分钟结束的时候呢,自动的就回到就绪状态了啊这是第一个,然后第二个呢,这个John,嗯,这个我就简写着吧,啊这个叫照案,这个结束吧,哎,照案对应的线上啊这个字又多了,照我就写这个join结束吧,哎,你能理解这个意思啊,就是你这个A里边调b.join就是B,这个线程呢,执行完了,哎,我就叫做join结束了,哎那么这时候A线程呢,就结束这种阻塞状态,这是它,然后下个呢,对应的叫等待同步锁,这个呢,我们叫做获取了同步锁。
17:42
哎,拿到同步锁了,这个咱们一会儿呢,详细的去说,然后这个呢叫wait wait呢叫等待,对,你不能老在这wait着啊,最终目的呢,还得去被唤醒,叫multiify,嗯,还有对应另外一个叫multi multiify oh,啊,这两个具体的区别呢,咱们讲到通信的时候呢,再说,那接下来呢,这个叫supend啊,这个supend的话叫挂起,你不能总是把这个线上挂着。
18:11
啊,就跟你可以形象点说,把这个一个人,就像那个线上,你把它挂到这个衣服钩上是吧,挂起来了,那他这不能老在这飘着呀,是吧,那你得给它卸下来啊,这个S份呢,对应另外一个方法叫S。在这呢,你看因为你这个色呢被过时了啊,所以它呢也就过时了,说这个呢,方法需要呢,跟我们这个色呢去搭配使用,那就很明确,它是一对出现的叫resume。嗯,这就相当于是结束这种挂起的状态,好这呢是咱们这个对应一下啊,呃,从这个阻塞呢到就绪的这样的几个方法跟它对应起来,当你到就绪以后,接下来呢,又去获取西部的执行权,再去运行,那再运行可能还会阻塞,那就再再阻阻了,阻完以后呢,再就绪就去再运行,最终的目的都是跑到这儿来。
19:05
啊,这是这样的情况,好,这呢是咱们说的叫线程的一个生命周期,这里边儿呢,每一个状态以及呢,哪些操作会导致从一种状态到另外一种状态,这个需要大家记住。需要你掌握啊,那么后续的时候呢,咱们还会讲其他的一些结构,呃,他们呢,也有几种状态,到那个时候呢,状态也是通过一些方法的调用,比如说你像咱们这里边运行着我A调照唤方法,诶它一下就阻册了是吧?到那个时候呢,咱们也会出现说从这种状态到另外一种状态,嗯,那个时候呢,咱们倒不是会说呃调每个方法,说调哪个方法从这到那儿了,而是说呢,这种状态呢,到另外一种状态的时候呢,某个方法会自动的执行,哎,到时候你关注一下那个方法叫什么。哎,就行啊,这个这个呃,还是举一个这个页面中这个稍微比较形象一点哈,比如大家呢,你这是手机端有一个页面,这个页面呢,其实对应的一个类,咱们用Java写的安卓,那就相当于都是面向对象的了啊,凡是你看到这个结构,它一定会有个对象,这才叫万事万物皆对象的。
20:11
哎,那么手机端呢,你看到这样一个页面,它这个页面呢,就对应个对象叫做activity啊,这是一个activity对象,然后呢,咱们手机端大家知道有好多的按钮啊,或者一些超链接啊,当你一点击的时候呢,就会出现另外一个页面了,那么你出现另外一个页面,那么你会关心诶,前个页面去哪了,前个页面对应的这个对象死了吗?可能会去想这个事儿,对吧。其实没死,只是说呢,被你这个新的页面是不是给覆盖住了。是吧,就像大家你现在桌上你放了一张纸,然后呢,你在这个纸上又又盖了一张纸,前面那张纸呢,其实还在,只是说呢,你现在被覆盖住了啊,那前一个页面呢,它就是一种看不见的状态啊,你可以理解为叫停止的状态,那么当你在这个页面当中,我点一下按钮出来它的时候呢,呃,它变成一种停止状态了,这个时候呢,会涉及到一些方法呢,自动就执行了,那大家到时候关注的就是诶那些方法执行,我我希望说你这个开它的时候呢,这块呢,诶有些操作,那你把那些操作就写在它那个状态改变的时候,那个方法当中就可以了。
21:17
哎,咱们后边呢,你比如说咱们通过这个页面,诶我一点这个按钮需要呢,开启一个新的页面,新的页面这个数据呢,你需要去访问后台了,后台呢,咱们讲web的时候会涉及到叫so,诶so的话,你一去请求它,诶这个so没有,就帮你把so创建好了,相当于就新建了,然后新建完以后呢,我需要让这个so去执行相应的操作,他就开始去运行,那就涉及到相关的一些生命周期方法要执行,那你这时候要关注我到底希望这个so干什么呀?哎,那你就写到那个方法当中就行,所以大家更多关注的就是这个状态切换的时候呢,哪些方法会掉,然后呢,诶,你如果说想做某些事,你就看我是希望在哪个状态出现的时候呢,做些什么事,你就写在那个方法当中,把那个要做的事儿写到方法体里面就可以了啊行,想清楚这个事呢就行,后续呢,咱们涉及到哪些结构的生命周期时候再说啊,这个就结束了。
我来说两句