Java 线程在 Thread.State 枚举中定义了六种状态:
NEW:新建,线程对象已创建但未调用 start()。RUNNABLE:可运行,包含操作系统层面的 running 和 ready——正在执行或等待 CPU 调度,Java 不区分这两者。BLOCKED:阻塞,等待获取监视器锁(synchronized)时被拒绝进入。WAITING:无限期等待,由 Object.wait()(无超时)、Thread.join()(无超时)、LockSupport.park() 进入,需其他线程显式唤醒(notify/notifyAll/unpark)。TIMED_WAITING:限时等待,sleep(long)、wait(long)、join(long)、parkNanos 等,超时自动返回。TERMINATED:终止,run() 执行完毕或异常退出。
转换关系:NEW --start()--> RUNNABLE;RUNNABLE 竞争 synchronized 失败进入 BLOCKED,获得锁后回到 RUNNABLE;调用 wait/join/park 进入 WAITING,被唤醒后若需竞争锁则先到 BLOCKED;sleep 等进入 TIMED_WAITING,到时回 RUNNABLE;run 结束进入 TERMINATED(不可逆,已终止的线程不能再次 start,否则抛 IllegalThreadStateException)。
易错点:BLOCKED 只用于 synchronized 等待锁的场景,ReentrantLock 的 lock() 等待进入的是 WAITING;wait 必须在持有该对象监视器的同步块内调用。
追问方向:wait 与 sleep 的区别?(释放锁与否、所属类、唤醒方式)interrupt 如何影响各状态?
(约 360 字)