Java中的线程间通信

线程间通信或协作是允许同步线程相互通信的机制。

协作(线程间通信)是一种机制,在该机制中,一个线程在其关键部分中被暂停运行,另一个线程被允许进入(或锁定)相同的关键部分以被执行。它是通过Object类的以下方法来实现的:

  • wait()方法
  • notify()方法
  • notifyAll()方法

wait()方法

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

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

MethodDescription
public final void wait()throws InterruptedException它一直等到对象被通知。
public final void wait(long timeout)throws InterruptedException它等待指定的时间量。

notify()方法

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

语法:

public final void notify()  

notifyAll()方法

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

语法:

public final void notifyAll()  

理解线程间通信的过程

inter-thread-communication-in-java.png

上面图表的逐点解释如下:

  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() 方法通知在指定的时间后,睡眠完成。

在Java中的线程间通信示例

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

Test.java

class Customer{    
int amount=10000;    
    
synchronized void withdraw(int amount){    
System.out.println("going to withdraw...");    
    
if(this.amount<amount){    
System.out.println("Less balance; waiting for deposit...");    
try{wait();}catch(Exception e){}    
}    
this.amount-=amount;    
System.out.println("withdraw completed...");    
}    
    
synchronized void deposit(int amount){    
System.out.println("going to deposit...");    
this.amount+=amount;    
System.out.println("deposit completed... ");    
notify();    
}    
}    
    
class Test{    
public static void main(String args[]){    
final Customer c=new Customer();    
new Thread(){    
public void run(){c.withdraw(15000);}    
}.start();    
new Thread(){    
public void run(){c.deposit(10000);}    
}.start();    
    
}}    

输出:

going to withdraw...
Less balance; waiting for deposit...
going to deposit...
deposit completed...
withdraw completed

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想