1. 线程生命周期概述
在Java多线程编程中,理解线程的生命周期是每个开发者必须掌握的基础知识。就像人的一生会经历不同阶段一样,Java线程从创建到销毁也会经历若干个明确的状态转换。这些状态定义在java.lang.Thread类的State枚举中,清晰地勾勒出一个线程从出生到消亡的完整轨迹。
我刚开始接触多线程时,常常困惑为什么有些线程明明调用了start()方法却迟迟不执行,或者为什么有些线程看起来已经"结束"却还能继续工作。直到系统性地梳理了线程状态机,这些问题才迎刃而解。掌握这些状态转换规律,不仅能帮助我们编写更健壮的多线程程序,还能在调试时快速定位线程阻塞或死锁的问题所在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java线程的六种状态详解
2.1 NEW(新建状态)
当使用new Thread()创建一个线程对象时,线程就处于NEW状态。这个阶段的线程就像一张白纸,虽然已经分配了内存空间,但还没有任何执行轨迹。此时线程的PCB(进程控制块)尚未创建,操作系统层面也感知不到这个线程的存在。
java复制Thread thread = new Thread(() -> {
System.out.println("线程执行体");
});
// 此时thread.getState()返回Thread.State.NEW
需要注意的是,直接调用run()方法并不会改变线程状态:
java复制thread.run(); // 仍然是NEW状态,因为是在当前线程同步执行
2.2 RUNNABLE(可运行状态)
调用start()方法后,线程进入RUNNABLE状态。这个状态其实包含两个子状态:
- 就绪(Ready):线程等待CPU时间片
- 运行中(Running):线程正在CPU上执行
java复制thread.start(); // 状态变为RUNNABLE
在Linux系统下,此时内核会调用clone()创建轻量级进程,Java线程与内核线程是1:1映射关系。线程调度由操作系统负责,开发者无法精确控制执行顺序。
注意:RUNNABLE状态下的线程可能因为时间片用完而回到就绪队列,这对开发者是透明的。
2.3 BLOCKED(阻塞状态)
当线程试图获取一个被其他线程持有的对象锁时,
