当前位置:实例文章 » 其他实例» [文章]notify()与notifyAll

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()` 不会阻塞当前线程。

相关标签:
其他信息

其他资源

Top