【Java中的线程间通信】线程间通信或协作就是允许同步线程彼此通信。
合作(线程间通信)是一种机制, 其中一个线程在其关键部分中暂停运行, 并允许另一个线程进入(或锁定)要执行的同一关键部分中。它是通过以下Object类的方法实现的:
- 等待()
- 通知()
- notifyAll()
使当前线程释放锁定, 并等待直到另一个线程为此对象调用notify()方法或notifyAll()方法, 或者经过了指定的时间。
当前线程必须拥有此对象的监视器, 因此只能从同步方法中调用它, 否则它将引发异常。
方法 | 描述 |
---|---|
public final void wait()throws InterruptedException | 等待直到对象被通知。 |
public final void wait(long timeout)throws InterruptedException | 等待指定的时间。 |
唤醒正在此对象的监视器上等待的单个线程。如果有任何线程在该对象上等待, 则选择其中一个唤醒。该选择是任意的, 并且可以根据实现情况进行选择。句法:
公共最终无效notify()
3)notifyAll()方法
唤醒正在此对象的监视器上等待的所有线程。句法:
公共最终无效notifyAll()
了解线程间通信的过程
文章图片
上图的点对点解释如下:
- 线程进入以获取锁。
- 锁是通过线程获取的。
- 现在, 如果你在对象上调用wait()方法, 线程将进入等待状态。否则, 它将释放锁定并退出。
- 如果调用notify()或notifyAll()方法, 线程将移至已通知状态(可运行状态)。
- 现在可以使用线程来获取锁。
- 任务完成后, 线程释放锁定并退出对象的监视状态。
这是因为它们与锁相关, 并且对象具有锁。
等待和睡眠之间的区别?
让我们看看等待和睡眠方法之间的重要区别。
wait() | sleep() |
---|---|
wait() method releases the lock | sleep()方法不会释放锁。 |
是Object类的方法 | 是Thread类的方法 |
是非静态方法 | 是静态方法 |
是非静态方法 | 是静态方法 |
应该通过notify()或notifyAll()方法通知 | 在指定的时间后, 睡眠完成。 |
让我们看一下线程间通信的简单示例。
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();
}}
Output: going to withdraw...
Less balance;
waiting for deposit...
going to deposit...
deposit completed...
withdraw completed
推荐阅读
- Java Runtime类
- Java中断线程
- win10系统隐藏库文件夹图文详细教程
- 升级Win10后office用不了怎样处理?
- Win10磁盘占用100%处理办法
- Win10蓝屏出错0x0000003B怎样办
- Win10隐藏任意程序运行界面图文详细教程
- Edge浏览器更改首页图文详细教程
- Win10关闭隐藏删除小娜办法