notifyAll方法详解(定义作用及使用示例)

notifyAll方法详解(定义作用及使用示例)-mikechen

Java多线程经常会使用到notifyAll方法,下面重点来详解notifyAll方法的作用与使用@mikechen

notifyAll方法定义

notifyAll() 方法是java.lang.Object类的一个方法,用于唤醒等待在同一个对象上的所有线程。

 

notifyAll方法作用

notifyAll() 通常用于解决多线程编程中的线程同步问题,特别是在使用对象的等待和通知机制时。

当一个线程调用了对象上的 notifyAll() 方法时,所有在该对象上等待的线程都会被唤醒,它们将重新竞争执行权。

 

notifyAll方法示例

调用语法:

public final void notifyAll()

以下是一个示例,演示了如何使用 notifyAll() 方法来唤醒等待的线程。

public class MyThread extends Thread {
    private Object lock;

    public MyThread(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock) {
            System.out.println(getName() + " is waiting.");
            try {
                lock.wait(); // 线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName() + " is awake.");
        }
    }

    public static void main(String[] args) {
        Object lock = new Object();
        MyThread thread1 = new MyThread(lock);
        MyThread thread2 = new MyThread(lock);

        thread1.start();
        thread2.start();

        try {
            Thread.sleep(1000); // 等待一秒钟,确保两个线程都在等待状态
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        synchronized (lock) {
            lock.notifyAll(); // 唤醒所有等待在lock对象上的线程
        }
    }
}

在上面的示例中,两个线程(thread1 和 thread2)等待在同一个对象 lock 上。

当主线程调用 lock.notifyAll() 时,这两个线程都会被唤醒。

 

notifyAll注意事项

主要包含几点:

  • notifyAll() 方法应该在同步块或同步方法中调用,以确保线程安全。
  • 使用 notifyAll() 方法时要小心,因为它会唤醒所有等待的线程,可能导致资源争用和性能问题。
  • 如果只需要唤醒一个等待线程,可以使用 notify() 方法。
  • 在调用 notifyAll() 之后,等待线程之间的执行顺序是不确定的,具体取决于操作系统和线程调度器。
评论交流
    说说你的看法