notify()与notifyAll
发布人:shili8
发布时间:2025-01-13 06:47
阅读次数:0
**通知机制Notify()与NotifyAll()**
在Java多线程编程中,`notify()` 和 `notifyAll()` 是两个非常重要的方法,它们用于唤醒等待线程。虽然这两个方法看起来很相似,但它们有着不同的作用和使用场景。
**1. notify()**
`notify()` 方法会唤醒一个正在等待的线程。这个线程是通过 `wait()` 或 `join()` 方法进入睡眠状态的。当 `notify()` 被调用时,Java虚拟机(JVM)会随机选择一个正在等待的线程,并将其唤醒。
javapublic class NotifyExample { public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Thread thread = new Thread(() -> { synchronized (lock) { System.out.println("Thread is waiting..."); try { lock.wait(); // 等待线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Thread is awakened."); } }); thread.start(); Thread.sleep(1000); // 等待1秒 synchronized (lock) { System.out.println("Main thread is notifying..."); lock.notify(); // 唤醒线程 } thread.join(); } }
在这个例子中,我们有一个主线程和一个等待线程。主线程通过 `notify()` 方法唤醒等待线程。
**2. notifyAll()**
`notifyAll()` 方法会唤醒所有正在等待的线程。与 `notify()` 不同,`notifyAll()` 会将所有等待线程都唤醒,而不是随机选择一个。
javapublic class NotifyAllExample { public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Thread thread1 = new Thread(() -> { synchronized (lock) { System.out.println("Thread1 is waiting..."); try { lock.wait(); // 等待线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Thread1 is awakened."); } }); thread1.start(); Thread thread2 = new Thread(() -> { synchronized (lock) { System.out.println("Thread2 is waiting..."); try { lock.wait(); // 等待线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Thread2 is awakened."); } }); thread2.start(); Thread.sleep(1000); // 等待1秒 synchronized (lock) { System.out.println("Main thread is notifying all..."); lock.notifyAll(); // 唤醒所有线程 } thread1.join(); thread2.join(); } }
在这个例子中,我们有两个等待线程。主线程通过 `notifyAll()` 方法唤醒所有等待线程。
**总结**
`notify()` 和 `notifyAll()` 是两个非常重要的方法,它们用于唤醒等待线程。在实际编程中,选择使用哪个方法取决于具体场景和需求。如果需要随机唤醒一个等待线程,则使用 `notify()`;如果需要唤醒所有等待线程,则使用 `notifyAll()`。
**注意**
* 在使用 `wait()` 和 `join()` 方法时,必须在同一锁上调用 `notify()` 或 `notifyAll()`。
* 如果没有正在等待的线程,`notify()` 和 `notifyAll()` 都不会产生任何效果。
* `notify()` 和 `notifyAll()` 不会阻塞当前线程。