并发编程中,多线程管理是核心技能。理解线程的生命周期及其状态流转,对于排查死锁、优化性能至关重要。
JVM 规范中定义了六种线程状态(对应 java.lang.Thread.State 枚举)。任意时刻,一个线程只能处于其中一种状态。这六种状态分别是:
1. 新建(NEW)
线程对象已创建,但尚未调用 start() 方法。此时线程还未真正启动。
// 示例:线程处于 NEW 状态
Thread t = new Thread();
2. 可运行(RUNNABLE)
包含了操作系统层面的'就绪'和'运行'状态。线程正在等待 CPU 时间片,或者正在 CPU 上执行指令。一旦调用 start(),线程即进入此状态。
3. 阻塞(BLOCKED)
线程被阻塞,等待获取监视器锁(synchronized 关键字)。只有当其他线程释放了该对象的锁,它才能继续执行。
4. 无限期等待(WAITING)
线程不会自动唤醒,必须等待其他线程显式通知。常见触发方式包括:
- 调用
Object.wait()且无超时参数 - 调用
Thread.join()且无超时参数 - 调用
LockSupport.park()
5. 限期等待(TIMED_WAITING)
线程会等待指定时间后自动唤醒,无需其他线程干预。常见触发方式包括:
- 调用
Thread.sleep(millis) - 调用
Object.wait(timeout) - 调用
Thread.join(timeout)
6. 终止(TERMINATED)
线程执行完毕,或遇到未捕获异常而终止。此后该线程对象不可再次启动。
理解这些状态的转换逻辑,能帮助我们更好地控制并发行为,避免资源竞争和死锁问题。实际开发中,通过日志打印状态或调试工具观察状态流转,往往比盲目猜测更有效。

