chatgpt:
在 Java 中,notifyAll()
方法用于唤醒所有因调用 wait()
方法而被阻塞的线程。它是 Object
类的一部分,可以在任何对象上调用。这个方法的作用是唤醒所有在该对象的监视器锁(即该对象的 synchronized
块或方法)上等待的线程,但唤醒后并不会立即执行。线程必须重新竞争锁,才能继续执行。
notifyAll()
后:
notifyAll()
被调用时,所有在该对象上等待的线程会被唤醒并进入 就绪(Runnable) 状态。notifyAll()
只唤醒了这些线程,并不会自动获取锁。wait()
被挂起,等待条件被满足。class SharedResource {
private int counter = 0;
public synchronized void increment() {
counter++;
notifyAll(); // 唤醒所有等待的线程
}
public synchronized void waitForValue(int value) throws InterruptedException {
while (counter < value) {
wait(); // 线程在此处等待,直到 counter 达到 value
}
System.out.println("Counter reached " + value);
}
}
public class NotifyAllExample {
public static void main(String[] args) throws InterruptedException {
SharedResource resource = new SharedResource();
// 创建多个线程,每个线程都会等待某个值
Thread t1 = new Thread(() -> {
try {
resource.waitForValue(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try {
resource.waitForValue(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
t2.start();
// 让线程 t1 和 t2 等待
Thread.sleep(1000);
// 增加值并唤醒等待的线程
resource.increment(); // 唤醒所有等待的线程
}
}
waitForValue()
方法会使线程等待直到 counter
的值达到一定的阈值。在这个例子中,counter
达到 5
时,线程会被唤醒。increment()
方法通过调用 notifyAll()
唤醒所有等待的线程,通知它们继续执行。notifyAll()
唤醒的线程并不马上执行,它们会进入就绪状态,等到它们重新获得锁后,才能继续执行。wait()
而进入 等待(Waiting) 状态。notifyAll()
被调用时,这两个线程都会被唤醒并进入 就绪(Runnable) 状态。notifyAll()
会唤醒所有等待的线程,但唤醒后的线程并不是立即运行,它们依然需要重新竞争锁,因此它们的调度是由线程调度器决定的。