Java线程的生命周期(图文并茂)
Java 语言使用 Thread 类及其子类的对象来表示线程,在它的一个完整生命周期中通常要经历以下五种状态,分别是新建、就绪、运行、阻塞和死亡。
CPU 需要在多条线程之间切换,相应地,线程的状态也会多次在运行、阻塞、就绪之间切换,如下图所示:

图 1 线程生命周期1
下表对线程状态进行了详细阐述。
注意,当从 WAITING 或 TIMED_WAITING 状态恢复到 RUNNABLE 状态时,如果发现当前线程没有得到同步锁,线程就会立刻转入 BLOCKED 状态,如下图所示。

图 2 线程生命周期2
CPU 需要在多条线程之间切换,相应地,线程的状态也会多次在运行、阻塞、就绪之间切换,如下图所示:

图 1 线程生命周期1
下表对线程状态进行了详细阐述。
线程状态名称 | 线程状态说明 |
---|---|
新建(NEW) | 线程刚被创建,但并未启动,还没有调用 start 方法 |
可运行(RUNNABLE) | 这里并未对就绪状态与运行状态进行明确区分。原因在于,针对 Java 对象来说,它们仅能被标记为可运行状态,至于何时真正执行,并非由 JVM 直接控制,而是由操作系统负责调度的。此过程极为短暂,故而在 Java 对象的状态划分上,难以对这两种状态做出明确界定 |
死亡(TERMINATED) | 表明此线程已经结束生命周期,终止运行 |
阻塞(BLOCKED) | 在 API 的说明中,这种状态被定义为:线程正处于阻塞阶段,等待获取一个同步锁(锁对象)。只有成功获取锁对象,它才会获得执行的机会 |
计时等待(TIMED_WAITING) | 一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态 |
无限等待(WAITING) | 一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态 |
注意,当从 WAITING 或 TIMED_WAITING 状态恢复到 RUNNABLE 状态时,如果发现当前线程没有得到同步锁,线程就会立刻转入 BLOCKED 状态,如下图所示。

图 2 线程生命周期2