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() 之后,等待线程之间的执行顺序是不确定的,具体取决于操作系统和线程调度器。