Java 线程生命周期的六种状态详解

76 阅读2分钟

对于 Java 并发编程而言,深入理解线程的生命周期模型是一项基本要求。该模型为分析并发行为、诊断性能问题以及解决死锁等提供了理论基础。在 Java 虚拟机(JVM)层面,线程的状态被精确地定义在 java.lang.Thread.State 枚举中,共包含六种状态。

线程的六种状态

1. 新建状态 (NEW)

  • 定义:线程对象已由 new 关键字创建,但其 start() 方法尚未被调用。
  • 描述:在此状态下,线程仅作为普通的 Java 对象存在于堆内存中,尚未被操作系统纳入线程调度管理。

2. 可运行状态 (RUNNABLE)

  • 定义:此状态为一个复合状态,包含了操作系统线程模型中的“就绪”(Ready)与“运行中”(Running)两种情况。
  • 描述:线程调用 start() 方法后即进入此状态。处于“就绪”的线程具备执行资格,正在等待调度器分配 CPU 资源;处于“运行中”的线程则已获取 CPU 资源并正在执行其 run() 方法。JVM 规范并未对这两种情况进行区分。

3. 阻塞状态 (BLOCKED)

  • 定义:线程正在等待获取一个监视器锁(monitor lock)。
  • 描述:此状态专指线程试图进入一个 synchronized 关键字修饰的方法或代码块时,因该锁已被其他线程持有而引发的等待。

4. 等待状态 (WAITING)

  • 定义:线程进入一个无限期的等待,需要等待其他线程执行特定的通知(notification)操作才能被唤醒。
  • 描述:线程会释放 CPU 资源,直到被显式唤醒。
  • 触发条件:调用无参的 Object.wait()Thread.join()LockSupport.park()

5. 计时等待状态 (TIMED_WAITING)

  • 定义:线程进入一个有时限的等待。
  • 描述:线程将在指定的时间结束后由系统自动唤醒,或在此期间被其他线程提前唤醒。
  • 触发条件:调用 Thread.sleep(time),或调用带有超时参数的 wait(time)join(time) 等方法。

6. 终止状态 (TERMINATED)

  • 定义:线程的 run() 方法已正常执行完毕或因未捕获的异常而终止。
  • 描述:这是线程生命周期的最终状态。处于此状态的线程已结束执行,无法再次启动。

关键知识点辨析

在阐述线程生命周期时,准确说明以下几点是理解深度的体现:

  1. RUNNABLE 状态的复合性:应明确指出,该状态对应了操作系统层面的“就绪”与“运行”两个阶段。
  2. BLOCKEDWAITING 的区别
    • BLOCKED 状态的触发是被动的,且仅与 synchronized 监视器锁的竞争相关。
    • WAITING 状态的触发是主动的,由程序调用 wait()join() 等特定方法所致。
  3. 状态转换的触发机制:能够清晰列举出导致状态变迁的核心方法,例如 start(), wait(), sleep(), join() 以及由 synchronized 关键字引发的锁竞争。