更新时间:2023-10-27 来源:黑马程序员 浏览量:

notify()和notifyAll()都是Java中用于多线程编程的方法,用于在多线程环境中管理线程的等待和唤醒操作。它们的主要区别在于唤醒的目标线程数以及线程等待的条件。
notify()方法用于唤醒等待在对象上的一个随机线程。如果多个线程在同一个对象上等待,那么只有其中的一个线程会被唤醒,但无法确定是哪一个线程。这个方法通常用于线程之间的竞争条件,其中只有一个线程能够获得资源的情况。
示例代码:
class SharedResource {
public synchronized void doSomething() {
System.out.println("Thread " + Thread.currentThread().getId() + " is working.");
notify(); // 唤醒等待的线程
}
}
public class NotifyExample {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Runnable task = () -> {
synchronized (resource) {
try {
System.out.println("Thread " + Thread.currentThread().getId() + " is waiting.");
resource.wait(); // 等待资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread " + Thread.currentThread().getId() + " is awake.");
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.doSomething(); // 唤醒一个等待的线程
}
}在上面的示例中,notify()唤醒了其中一个等待的线程,但不能确定是哪一个线程被唤醒。
notifyAll()方法用于唤醒等待在对象上的所有线程。这意味着所有等待的线程都有机会争夺资源。这通常用于广播消息或者在共享资源可用时唤醒所有等待线程的情况。
和notifyAll()的区别是什么.jpg)
示例代码:
class SharedResource {
public synchronized void doSomething() {
System.out.println("Thread " + Thread.currentThread().getId() + " is working.");
notifyAll(); // 唤醒所有等待的线程
}
}
public class NotifyAllExample {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Runnable task = () -> {
synchronized (resource) {
try {
System.out.println("Thread " + Thread.currentThread().getId() + " is waiting.");
resource.wait(); // 等待资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread " + Thread.currentThread().getId() + " is awake.");
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.doSomething(); // 唤醒所有等待的线程
}
}在上面的示例中,notifyAll()唤醒了所有等待的线程,它们都有机会争夺资源。
总结:
(1)notify()唤醒一个等待的线程,选择唤醒哪个线程不确定。
(2)notifyAll()唤醒所有等待的线程,它们都有机会争夺资源。
毕业16个工作日,平均薪资13180元,就业率100%,广州黑马AI智能应用开发(Java)学科20250529班
2026-03-06毕业32个工作日,平均薪资11147元,就业率95%,广州黑马AI智能应用开发(Java)学科20250326班
2026-03-05黑马程序员2025全国就业数据发布:全学科平均就业率92.07%,AI开发类就业平均薪资达11869.67元。
2026-03-05黑马全国校区齐开班!场面太太太壮观了!
2026-03-03AI智能应用开发课程紧贴企业刚需,全程高效学习,直达中高级软件开发水平
2026-02-28风口正劲!黑马程序员又一AI智能应用开发班毕业当天100%就业!
2026-02-27