WAITING与TIMED_WAITING的本质区别在于是否设置超时限制:前者无限期等待其他线程通知(如wait()、join()),后者在指定时间后自动唤醒(如wait(1000)、join(2000))。

WAITING 与 TIMED_WAITING 的本质区别
线程进入 WAITING 状态,是因为它在无超时限制地等待另一个线程执行特定操作(如 notify() 或 join() 完成);而 TIMED_WAITING 是带时间上限的等待——超时一到,线程自动唤醒,无需依赖其他线程干预。这个“是否设了时间上限”,就是触发状态的分水岭。
用 Object.wait() 直观演示分水岭
同一个方法 wait(),调用方式不同,状态立刻不同:
-
obj.wait()→ 进入 WAITING(无限期等 notify / notifyAll) -
obj.wait(1000)→ 进入 TIMED_WAITING(最多等 1 秒,超时即醒)
下面是一段可运行的验证代码,启动线程后立即打印其状态:
public class WaitingStateDemo {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("t1 start: " + Thread.currentThread().getState());
lock.wait(); // ← 无参:触发 WAITING
System.out.println("t1 awakened");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
Thread t2 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("t2 start: " + Thread.currentThread().getState());
lock.wait(500); // ← 带参:触发 TIMED_WAITING(500ms)
System.out.println("t2 timed out or notified");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
t1.start(); t2.start();
Thread.sleep(100); // 确保 wait 已执行、状态已切换
System.out.println("t1 state: " + t1.getState()); // WAITING
System.out.println("t2 state: " + t2.getState()); // TIMED_WAITING
}
}
其他常见触发场景对照表
不同 API 的调用方式同样遵循“有无超时参数”这一分水岭逻辑:
-
Thread.join()→ WAITING;Thread.join(2000)→ TIMED_WAITING -
LockSupport.park()→ WAITING;LockSupport.parkNanos(1_000_000)→ TIMED_WAITING -
Condition.await()→ WAITING;Condition.await(3, TimeUnit.SECONDS)→ TIMED_WAITING
注意:sleep(long) 和 wait(long) 看似都带时间,但 sleep 不释放锁、不依赖同步块,它永远只进 TIMED_WAITING;而 wait 是否 TIMED_WAITING,只看有没有传时间参数。
如何实时观察状态变化
除了打印 getState(),还可借助 ThreadMXBean 获取更精确的快照:
ThreadMXBean bean = ManagementFactory.getThreadMXBean(); long tid = t1.getId(); ThreadInfo info = bean.getThreadInfo(tid); System.out.println(info.getThreadState()); // 输出 WAITING / TIMED_WAITING
配合 bean.dumpAllThreads(false, false) 可批量抓取所有线程状态,适合调试阻塞问题。

















