📜  Java中的线程间通信

📅  最后修改于: 2020-09-27 01:42:35             🧑  作者: Mango

Java中的线程间通信

线程间通信或合作就是关于允许同步线程彼此通信。

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

  • 等待()
  • 通知()
  • notifyAll()

1)wait()方法

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

当前线程必须拥有此对象的监视器,因此必须仅从同步方法中调用它,否则它将引发异常。

Method Description
public final void wait()throws InterruptedException waits until object is notified.
public final void wait(long timeout)throws InterruptedException waits for the specified amount of time.

2)notify()方法

唤醒正在此对象的监视器上等待的单个线程。如果有任何线程在此对象上等待,则选择其中一个唤醒。选择是任意的,并且可以根据实现情况进行选择。句法:

公共最终无效notify()

3)notifyAll()方法

唤醒正在此对象的监视器上等待的所有线程。句法:

公共最终无效notifyAll()

了解线程间通信的过程

上图的点对点解释如下:

  • 线程进入以获取锁。
  • 锁是通过线程获取的。
  • 现在,如果您在对象上调用wait()方法,线程将进入等待状态。否则,它将释放锁定并退出。
  • 如果调用notify()或notifyAll()方法,线程将移至已通知状态(可运行状态)。
  • 现在线程可用于获取锁。
  • 任务完成后,线程释放锁定并退出对象的监视状态。

为什么在对象类而不是线程类中定义了wait(),notify()和notifyAll()方法?

这是因为它们与锁有关,并且对象具有锁。

等待和睡眠之间的区别?

让我们看看等待和睡眠方法之间的重要区别。

wait() sleep()
wait() method releases the lock sleep() method doesn’t release the lock.
is the method of Object class is the method of Thread class
is the non-static method is the static method
is the non-static method is the static method
should be notified by notify() or notifyAll() methods after the specified amount of time, sleep is completed.

Java中的线程间通信示例

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

class Customer{
int amount=10000;

synchronized void withdraw(int amount){
System.out.println("going to withdraw...");

if(this.amount
Output: going to withdraw...
       Less balance; waiting for deposit...
       going to deposit...
       deposit completed...
       withdraw completed