在Java多线程编程中,我们常常会遇到需要唤醒所有等待中的线程的情况。这时,我们可以使用notifyAll方法来实现这一需求。
notifyAll方法是Java的Object类提供的一个方法,它用于唤醒所有正在等待该对象锁的线程。当一个线程调用了某个对象的notifyAll方法后,该对象上所有调用了wait方法而进入等待状态的线程将被唤醒并竞争重新获得锁。
下面我们来看一个使用notifyAll的示例:
public class NotifyAllExample {
public static void main(String[] args) {
Object lock = new Object();
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread 1 is waiting...");
lock.wait(); // 进入等待状态
System.out.println("Thread 1 is awakened!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread 2 is waiting...");
lock.wait(); // 进入等待状态
System.out.println("Thread 2 is awakened!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread3 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 3 is notifying all threads...");
lock.notifyAll(); // 唤醒所有等待中的线程
}
});
thread1.start();
thread2.start();
thread3.start();
}
}
在上面的示例中,我们创建了三个线程thread1、thread2和thread3,并且它们共享了一个对象lock。thread1和thread2在synchronized块中调用了lock对象的wait方法进行等待,而thread3在synchronized块中调用了lock对象的notifyAll方法来唤醒所有等待中的线程。
当我们运行这段代码时,可以看到thread1和thread2都会被唤醒并输出相应的日志信息。这就是因为thread3调用了lock对象的notifyAll方法,将lock对象上所有等待的线程全部唤醒。
通过使用notifyAll方法,我们可以实现在多线程编程中的线程唤醒操作。这可以更好地控制线程之间的协作,提高程序的灵活性和效率。