Java 中 wait 和 notify 的区别

10 Sept 2024 | 5 分钟阅读

在 Java 中,wait() 和 notify() 是 Object 类提供的两个方法,它们用于线程间的通信和同步。

wait() 方法

wait() 方法是 Java 编程语言中的一个同步方法,它使当前线程放弃对象的锁并进入睡眠状态,直到另一个线程在该对象上调用 notify 或 notifyAll 方法。

wait() 方法有三种形式

1. wait(): 线程将保持在等待状态,直到另一个线程在该对象上调用 notify 或 notifyAll 方法。线程将保持在等待状态,直到另一个线程在该对象上调用 notify 或 notifyAll 方法。

语法

2. wait(long timeout): wait(long timeout) 方法使当前线程放弃对象的锁并睡眠指定的毫秒数。

语法

3. wait(long timeout, int nanoseconds): wait(long timeout, int nanos) 方法使当前线程放弃对象的锁并睡眠指定的毫秒数和纳秒数。

语法

notify() 方法

notify() 方法是 Java 编程中的一个同步方法,它会唤醒等待在指定对象上的一个线程。

wait() 和 notify() 之间的区别

Wait()notify()
当线程调用 wait() 方法时,它会释放持有的监视器锁并进入等待状态。notify() 方法不会释放锁。它只是告诉其他线程锁可能很快就会被释放。锁的实际释放发生在当前线程完成同步块的执行时。
多个线程可以同时等待。当一个线程在对象上调用 notify() 方法时,会随机选择一个正在等待该对象的线程并通知它。被通知的线程将退出等待状态,进入阻塞状态。
在 Object 类中,定义了 wait() 方法。notify() 方法在 Object 类中定义
在线程间通信中,使用 wait() 方法。要唤醒,使用 notify() 方法唤醒一个线程。
wait() 方法定义在 Java.lang.Object 类中。notify() 方法没有返回值。
调用 wait() 方法需要同步锁。notify() 方法唤醒在特定对象上等待的一个线程。

程序

文件名: WaitNotifyDemo.java

输出

Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.
Producer produced 1 item.
Consumer consumed 1 item.

各种异常

1. wait()

InterruptedException: 如果线程在等待时被中断,则抛出此异常。如果另一个线程在等待线程上调用了 interrupt() 方法,则可能发生这种情况。

IllegalMonitorStateException: 如果线程在调用 wait() 方法时未拥有对象的监视器,则抛出此异常。

文件名: WaitDemo.java

输出

Computer
Keyboard

2. notify()

由于 notify 方法与 wait() 不同,notify 方法不会抛出 InterruptedException,因此无需将其包含在 try-catch 块中。

如果当前线程未拥有调用 notify() 方法的对象的监视器,则会抛出 IllegalMonitorStateException 异常。

文件名: NotifyDemo.java

输出

Phone
Electronics