Java线程生命周期的5种状态(新手必看)
当线程对象被创建时,线程的生命周期就已经开始了,直到线程对象被撤销为止。
在整个生命周期中,线程并不是创建后即进入可运行状态,线程启动之后,也不是一直处于可运行状态。在整个生命周期中线程有多种状态,这些状态之间可以互相转化。
Java 线程的生命周期可以分为 5 种状态,分别是创建状态、就绪状态、运行状态、阻塞状态和终止状态。一个线程创建之后,总是处于其生命周期的 5 种状态之一。
线程的状态表明此线程当前正在进行的活动,而线程的状态是可以通过程序进行控制的,即可以对线程进行操作来改变状态。
线程状态间的转换关系如下图所示:

图 1 线程状态转换图
阻塞状态可以分为三种:
下面这几种情况都会导致线程切换到终止状态:
在整个生命周期中,线程并不是创建后即进入可运行状态,线程启动之后,也不是一直处于可运行状态。在整个生命周期中线程有多种状态,这些状态之间可以互相转化。
Java 线程的生命周期可以分为 5 种状态,分别是创建状态、就绪状态、运行状态、阻塞状态和终止状态。一个线程创建之后,总是处于其生命周期的 5 种状态之一。
线程的状态表明此线程当前正在进行的活动,而线程的状态是可以通过程序进行控制的,即可以对线程进行操作来改变状态。
线程状态间的转换关系如下图所示:

图 1 线程状态转换图
1) 创建状态
使用 new 运算符调用 Thread 类或其子类的构造方法创建一个线程对象后,该线程对象就处于创建状态。2) 就绪状态
当线程对象调用了 start() 方法之后,就进入就绪状态。就绪状态的线程处于就绪队列中,要等待 JVM 的调度。3) 运行状态
如果就绪状态的线程获取了 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。4) 阻塞状态
如果一个线程执行了 sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。阻塞状态可以分为三种:
- 等待阻塞:运行状态中的线程执行wait()方法,使线程进入等待阻塞状态。
- 同步阻塞:线程获取synchronized同步锁失败。
- 其他阻塞:通过调用线程的 sleep() 或 join() 发出 I/O 请求时,线程就会进入阻塞状态。当 sleep() 状态超时、join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
5) 终止状态
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。下面这几种情况都会导致线程切换到终止状态:
- run() 方法执行完成,线程正常结束;
- 线程抛出一个未捕获的 Exception 或 Error;
- 直接调用该线程的 stop() 方法来结束线程,但该方法已经过时,不推荐使用。