Java 中的线程间通信

2025 年 3 月 28 日 | 阅读 2 分钟

线程间通信协作 是指允许同步线程相互通信。

协作(线程间通信)是一种机制,其中一个线程在其临界区内暂停运行,允许另一个线程进入(或锁定)同一个临界区以执行。它通过 Object 类 的以下方法实现:

  • wait()
  • notify()
  • notifyAll()

1) wait() 方法

wait() 方法导致当前线程释放锁,并等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll() 方法,或者指定的等待时间已过。

当前线程必须拥有该对象的监视器,因此它只能从同步方法中调用,否则会抛出异常。

方法描述
public final void wait()throws InterruptedException它会一直等待直到对象被通知。
public final void wait(long timeout)throws InterruptedException它会等待指定的时长。

2) notify() 方法

notify() 方法会唤醒一个正在等待该对象监视器的单个线程。如果该对象上有任何线程正在等待,其中一个将被选择唤醒。选择是任意的,并且由实现自行决定。

语法

3) notifyAll() 方法

唤醒所有正在等待该对象监视器的线程。

语法

理解线程间通信的过程

inter thread communication in java

上面图示的点对点解释如下:

  1. 线程进入以获取锁。
  2. 锁被一个线程获取。
  3. 现在,如果调用对象上的 wait() 方法,线程将进入等待状态。否则,它将释放锁并退出。
  4. 如果调用 notify() 或 notifyAll() 方法,线程将移动到已通知状态(可运行状态)。
  5. 现在线程可以获取锁了。
  6. 完成任务后,线程释放锁并退出对象的监视器状态。

为什么 wait()、notify() 和 notifyAll() 方法定义在 Object 类而不是 Thread 类中?

因为它们与锁有关,而对象拥有锁。

wait() 和 sleep() 的区别?

让我们看看 wait() 和 sleep() 方法之间重要的区别。

wait()sleep()
wait() 方法会释放锁。sleep() 方法不会释放锁。
它是 Object 类的一个方法它是 Thread 类的一个方法
它是非静态方法它是静态方法
它应该由 notify() 或 notifyAll() 方法通知等待指定的时间后,sleep() 方法完成。

Java 中线程间通信的示例

让我们看一个简单的线程间通信示例。

示例

编译并运行

输出

going to withdraw...
Less balance; waiting for deposit...
going to deposit...
deposit completed...
withdraw completed
下一个主题中断线程