00:00
各位小伙伴大家好,今天我为大家分享的是Java中现成的状态,一幅图带你了解线程状态的扭转。我们来看这一张图,这张图的话是很多课程中会用到的一个图。线程在被实例化之后会进入到新建状态,当执行二的方法之后,会进入到一个运行状态。然后当运行完成之后,才会进入到一个终止状态。其中,在运行状态中,它又分为两个子状态,就绪状态和运行中状态。它俩的区别是在于是否得到了CPU。如果说呃得到CPU的时间片,那么它就进入到了运行中。反之,它会进入到ready的这么一个状态。我们也可以通过这个页的方法,让它从运行中状态脱离出来,立马转成一个ready状态。
01:00
然后在这个run able的过程中。我们可以通过调用wait呀,Join啊,Park啊这些方法。去让这个线程转成一个等待的状态。然后在等待状态下,我们可以去调用notify notify all on park这些方法,让它再回到可运行的这个状态。或者我们也可以通过sleep wait join,其实跟这个方法很相似,它只是说多了一个参数,这个参数就是它的一个超时时间,然后让这个线程进入到超时等待的一个状态。呃,唤醒的方法其实都比较类似,这两个状态的区别是,如果说我们用的是这个超时等待的这个方法,那超过这个时间之后,它会自动的被唤醒。这样就可以避免说我们执行的时间太长,它一直被锁死,或者说我们忘记唤醒之后进入了一个锁死的一个状态,然后还有一个是呃阻塞,这个阻塞的话是跟s night的这个关键字紧密相关的,如果没有获取到这个s night的锁,它会进入到阻塞状态,获取到锁之后,它会转到run的一个状态。
02:17
然后线程执行完毕之后,它会进入一个终止的状态。当然如果在运行的过程中出现了任何异常,它也是会转到这个终止状态的,那线程的整个调度的一个过程是这样的,这个图其实还是比较好的,但是他有一点不太好记忆,就是它整个过程会比较的乱,还有一个就是说他这里会标出就绪跟运行中这两个其实并不是Java的一个线程的一个状态,Java的那个线程状态只有六种,新建、超时、等待、阻塞、等待。终止,还有可运行这六种状态,并不没有这两个状态,那我们来看另外一张图,这张图的话其实跟那个图是大同小异的,只不过是我这里把它整理了一下,我们把这个图,呃,有一个记忆的一个方法,这个图其实就是一个三角。
03:12
就是这个三角还有一个长方形,这个长方形代表的是这个线程正常运行的一个过程,而且这个过程是不可逆的。三角代表的是说我们这些。过程是相互可逆的,并且这个三角部分另外一个含义是说,我们想要进到这三个阻塞的状态,都必须是这个线程在run的情况下才能进去,这样子的话记忆起来会比较方便,我们就记住三角和长方形就可以了。然后这里我们会用虚线标识说我们从waiting和time的waiting可以转到。Block的这个状态,然后也有去标明它是什么情况下会进入去,相比而言,这个图我个人理解的是说它会更好记忆一些。
04:00
好的,今天的分享就到这里,如果对你有所帮助的话,请分享关注之后我们还会分享别的一些面试题。
我来说两句