3
多线程是好多编程语言中的一个重要组成部分,尤其在Java编程中更加重要,可以充分利用计算机的资源,以处理更多任务。下面将介绍线程的基础知识,即:线程的生命周期,已经生命周期中各个节点状态的相互转变。微信搜索公众号:”菜鸟封神记“,定期分享一线大厂常用技术干货。

1.组成线程生命周期的五个主要阶段

NEW(线程创建状态)
RUNNABLE(线程就绪状态)
RUNNING(线程运行状态)
BLOCKED(线程阻塞状态)
TERMINATED(线程死亡状态)

2.每个状态和其他状态的转变

  • 2.1 线程的NEW状态

当使用new关键字来创建一个线程对象时,在没有调用该对象的start方法之前,该线程并没有处于执行状态,因为线程没有启动,压根儿就不存在。和创建一个其他普通对象一样,只有通过调用start方法才能使线程进入到RUNNABLE状态。

  • 2.2 线程的RUNNABLE状态

只有调用线程对象的start方法之后,线程才会进入到该状态。但是进入到该状态的线程并不会立刻去执行。必须等到CPU调度,得到CPU分配的时间片之后,才可以执行,进入到RUNNING状态。所以在调用start方法之后,进入RUNNING之前的这段时间,线程状态为RUNNABLE状态,即:可执行状态。该状态下只能进入到RUNNING状态或者意外终止,不能进入到BLOCKED状态或者TERMINATED状态。

  • 2.3 线程的RUNNING状态

当处于RUNNABLE状态的线程得到CPU分配的时间片之后,才可以真正去执行线程内部的处理逻辑,处于RUNNING状态的线程,本身也是RUNNABLE的,但是处于RUNNABLE状态的线程不能也是RUNNING的。处于该状态下的线程,通过CPU调度或者中断等操作可以发生以下的状态转变:
(1) 调用线程的stop方法进入到TERMINATED状态
(2) 调用线程的sleep方法或者wait方法进入到BLOCKED状态
(3) 执行带阻塞的IO操作,进入到BLOCKED状态
(4) 进行锁竞争,进入到锁等待队列中,处于BLOCKED状态
(5) 由于受到CPU的调度,将时间片分配给了其他线程,则会进入到RUNNABLE状态
(6) 线程本身调用了yield方法,将CPU执行权放弃,进入到RUNNABLE状态

  • 2.4 线程的BLOCKED状态

线程由于锁竞争,IO阻塞,CPU调度或者其他原因进入到了BLOCKED状态之后,可以再次切换到以下几种状态:
(1) 调用stop()方法或者由于JVM意外崩溃而直接进入到TERMINATED状态
(2) 阻塞状态结束,比如IO操作完成之后,会再次进入到RUNNABLE状态
(3) 调用sleep之后,过了一段时间,休眠完成,会重新进入到RUNNALBE状态
(4) 调用wait方法之后,由于其他线程使用了notify或者notifyAll,将线程唤醒,此时会进入到RUNNABLE状态
(5) 锁竞争中,等待一段时间之后获取到了锁资源,进入到RUNNABLE状态

  • 2.5 线程的TERMINATED状态

如果线程进入到了TERMINATED状态之后,将没有机会再次进入到其他状态。因为该状态为线程生命周期中的最后一个状态,下面的几种情况将会使线程进入到TERMINATED状态:
(1) 线程生命周期正常结束,也就是线程中的执行逻辑正常结束
(2) 线程运行时出现异常意外结束
(3) JVM进程崩溃,会导致线程直接进入到TERMINATED状态

3.线程状态转换示意图

图片描述

以上就是线程生命周期中的几种状态详解及相互转换。欢迎评论转发。
另提供一些免费的IT视频资料,架构师教程!如需要请查看https://www.592xuexi.com


夏日寒冰
318 声望85 粉丝

忠实的技术爱好者,追求极致,喜欢总结一些自己用过的技术点,与他人交流分享。