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

