对于 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()方法已正常执行完毕或因未捕获的异常而终止。 - 描述:这是线程生命周期的最终状态。处于此状态的线程已结束执行,无法再次启动。
关键知识点辨析
在阐述线程生命周期时,准确说明以下几点是理解深度的体现:
RUNNABLE状态的复合性:应明确指出,该状态对应了操作系统层面的“就绪”与“运行”两个阶段。BLOCKED与WAITING的区别:BLOCKED状态的触发是被动的,且仅与synchronized监视器锁的竞争相关。WAITING状态的触发是主动的,由程序调用wait()或join()等特定方法所致。
- 状态转换的触发机制:能够清晰列举出导致状态变迁的核心方法,例如
start(),wait(),sleep(),join()以及由synchronized关键字引发的锁竞争。