Java 线程的 6 种状态详解
在 Java 并发编程中,理解线程的生命周期是掌握多线程的关键。线程在运行过程中会经历不同的状态转换,这些状态由 JVM 管理,并不完全等同于操作系统的线程状态。
线程的 6 种状态
线程在同一时刻只能处于一种状态,主要包括以下六种:
1. NEW(新建)
当创建一个线程对象后,但在调用 start() 方法之前,线程处于 NEW 状态。此时线程还未真正启动,只是存在于内存中。
2. RUNNABLE(可运行)
一旦调用了 start() 方法,线程就进入 RUNNABLE 状态。这并不意味着线程一定正在 CPU 上执行,它可能正在等待操作系统调度分配时间片。只要线程没有因为等待锁或其他资源而阻塞,它就属于这个范畴。
3. BLOCKED(阻塞)
如果线程试图获取一个已被其他线程持有的监视器锁(monitor lock),它就会进入 BLOCKED 状态。它会一直等待,直到锁被释放。这是多线程同步中最常见的阻塞场景之一。
4. WAITING(无限等待)
线程进入此状态意味着它在等待另一个线程执行特定动作,且没有设置超时时间。常见的方法包括 Object.wait()、Thread.join() 和 LockSupport.park()。只有当其他线程发出通知(如 notify)或目标线程结束时,该线程才会被唤醒。
5. TIMED_WAITING(计时等待)
与 WAITING 类似,但这里有一个明确的等待时限。例如调用 Thread.sleep(long millis)、Object.wait(long timeout) 或 Thread.join(long millis)。无论是否收到通知,到达指定时间后线程都会自动恢复运行。
6. TERMINATED(终止)
当线程的 run() 方法正常执行完毕,或因未捕获的异常而终止时,线程进入 TERMINATED 状态。此后该线程对象不可再次启动。
相关状态转换方法
上述状态的流转通常依赖于几个核心方法:
- wait(): 使当前线程等待,释放锁,进入 WAITING 或 TIMED_WAITING。
- notify() / notifyAll(): 唤醒在该对象监视器上等待的线程。
- yield(): 提示调度器让出 CPU,线程回到 RUNNABLE 队列。
- sleep(): 暂停执行指定时间,期间不释放锁,进入 TIMED_WAITING。
- join(): 等待另一个线程结束,进入 WAITING 或 TIMED_WAITING。
理解这些状态及其转换机制,能帮助我们在调试死锁、性能瓶颈时快速定位问题。实际开发中,结合线程堆栈分析工具查看状态,往往比单纯猜测更有效。


