江明涛的博客
notifyAll 使用示例
notifyAll 使用示例

notifyAll 使用示例

在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方法,我们可以实现在多线程编程中的线程唤醒操作。这可以更好地控制线程之间的协作,提高程序的灵活性和效率。