Java 线程创建中 WAITING 状态是什么意思
waiting 状态表示线程正在无限期地等待另一个线程执行特定操作,直到被显式唤醒。在 java 线程生命周期中,当线程调用 object.wait()、thread.join() 或 locksupport.park() 且没有设置超时时间时,就会进入该状态。此时线程不会消耗 cpu 资源,而是挂起在对象监视器或锁上,直到其他线程调用 notify()、notifyall() 或 unpark()。

什么情况下线程会进入 WAITING 状态
线程进入 WAITING 状态通常是因为调用了无超时的阻塞方法。最常见的是在同步代码块中调用 wait(),或者主线程等待子线程结束调用 join()。此外,使用 ReentrantLock 配合 Condition.await() 也会导致线程进入 WAITING 状态。这些方法的共同点是它们要求线程释放持有的锁(对于 wait/await)或暂时放弃执行权(对于 join),并进入等待队列。

public class WaitingExample {
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
synchronized (WaitingExample.class) {
try {
System.out.println("Worker: Waiting for notification...");
WaitingExample.class.wait(); // 进入 WAITING 状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
worker.start();
Thread.sleep(1000);
synchronized (WaitingExample.class) {
System.out.println("Main: Notifying worker...");
WaitingExample.class.notify(); // 唤醒 worker
}
worker.join();
System.out.println("Worker finished.");
}
}WAITING 与 TIMED_WAITING 的区别是什么
WAITING 和 TIMED_WAITING 的主要区别在于是否指定了等待时间。WAITING 是无限期的,线程必须等待其他线程的显式唤醒信号;而 TIMED_WAITING 是有期限的,线程会在指定的时间结束后自动恢复运行,即使没有收到唤醒信号。例如,Thread.sleep(5000)、Object.wait(1000) 或 LockSupport.parkNanos(1000000) 都会使线程进入 TIMED_WAITING 状态。这种机制允许程序实现超时控制,防止线程永久挂起。
立即学习“Java免费学习笔记(深入)”;

public class TimedWaitingExample {
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
try {
System.out.println("Worker: Sleeping for 5 seconds...");
Thread.sleep(5000); // 进入 TIMED_WAITING 状态
System.out.println("Worker: Woke up after timeout.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
worker.start();
worker.join();
System.out.println("Main: Worker completed.");
}
}


















