notifyAll()
方法在多线程编程中的作用是唤醒所有正在等待某个对象锁的线程。当一个线程调用了某个对象的 wait()
方法时,该线程会释放该对象的锁并进入等待状态。当另一个线程调用了相同对象的 notifyAll()
方法时,所有处于等待状态的线程将被唤醒并重新尝试获取对象锁。
需要注意的是,notifyAll()
方法只能在同步代码块或同步方法中使用,因为它需要在调用时持有对象的锁。此外,notifyAll()
方法并不能保证唤醒的线程立即执行,因为它们需要重新获取对象锁,而这个锁可能正在被其他线程持有。
notifyAll()
方法通常用于以下场景:
示例代码:
public class NotifyAllExample {
private final Object lock = new Object();
public void producer() {
synchronized (lock) {
System.out.println("Producing data...");
// 假设生产数据的过程需要一些时间
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Data produced, notifying all waiting threads.");
lock.notifyAll();
}
}
public void consumer() {
synchronized (lock) {
while (true) {
try {
System.out.println("Waiting for data...");
lock.wait();
System.out.println("Data received, processing...");
// 假设处理数据的过程需要一些时间
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
在这个示例中,producer()
方法生产数据,然后调用 lock.notifyAll()
唤醒所有等待的消费者线程。consumer()
方法中的线程在没有数据可用时调用 lock.wait()
进入等待状态。当生产者线程唤醒它们时,它们将开始处理数据。