首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java编程教程-Java中的线程间通信

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

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

wait()方法

notify()方法

notifyAll()方法

# wait()方法

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

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

# notify()方法

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

语法:

public final void notify()

# notifyAll()方法

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

语法:

public final void notifyAll()

理解线程间通信的过程

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

线程进入以获取锁。

锁被一个线程获得。

如果在对象上调用wait()方法,线程现在进入等待状态。否则,它释放锁并退出。

如果调用notify()或notifyAll()方法,线程转移到通知状态(可运行状态)。

现在线程可以获取锁。

在完成任务后,线程释放锁并退出对象的监视器状态。

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

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

# wait和sleep之间的区别

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

# 在Java中的线程间通信示例

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

Test.java

class Customer{ int amount=10000; synchronized void withdraw(int amount){ System.out.println("going to withdraw..."); if(this.amountSystem.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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O-oZfcivKegpSg-S07uFQlfQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券