在 Java 中,线程的状态可以分为六种,
分别是:
新建(NEW) 线程对象已经被创建,但还没有调用 start() 方法启动线程。
可运行(RUNNABLE) 线程已经启动,正在运行或准备运行中。此状态下,线程可能正在 CPU 上执行,也可能在等待 CPU 时间片。
阻塞(BLOCKED) 线程在等待获取一个排他锁(如 synchronized),但该锁被其他线程占用。线程无法继续执行,直到获得锁。
等待(WAITING) 线程无限期地等待其他线程显式唤醒。线程处于这种状态通常是调用了 Object.wait()、Thread.join() 或 LockSupport.park() 方法
超时等待(TIMED_WAITING) 线程等待指定的时间后会自动被唤醒。常见的方法包括 Thread.sleep(long millis)、Object.wait(long timeout)、Thread.join(long millis) 等
终止(TERMINATED) 线程已经执行完毕或因异常退出,进入终止状态。
线程状态流转:
- 调用 start() 方法后,线程从新建状态转移到可运行状态
- 如果线程在执行过程中需要等待一个锁,它将进入阻塞状态
- 如果线程调用了 wait() 方法且没有传入等待时间线程会进入无期限等待状态,
- 如果线程调用了 sleep()、wait(long timeout) 或 join(long millis) 等方法,它将进入超时等待状态。
- 线程执行完 run() 方法或因异常终止时,线程进入终止状态。
- 当线程成功获取到锁,它将从阻塞状态转移到可运行状态。
- 当另一个线程调用 notify()、notifyAll() 或 unpark() 时,等待线程将被唤醒,进入可运行状态。
- 线程等待时间到达或其他线程提前唤醒时,将从超时等待状态转移到可运行状态。
- 线程一旦进入终止状态,就不会再转移到其他状态。
线程状态之间的流转是由各种同步、等待机制控制的,这些状态之间的流转反映了线程的生命周期。