乐趣区

线程生命周期总结

多线程是好多编程语言中的一个重要组成部分,尤其在 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

退出移动版