脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页软件编程java→ Java线程通信

Java实现线程通信的案例讲解

  更新时间:2022年05月26日 14:17:08  作者:遇安.112 
所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。本文将通过案例详解Java中线程通信的实现,感兴趣的可以了解一下

什么是线程通信、如何实现?

所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。

线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。

线程通信常见模型

生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。

要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己

public class 多线程_5线程通信 extends Thread{

public static void main(String[] args) {
//定义线程类,创建一个共享的账户对象
account3 a=new account3("abc",0);
//创建两个取钱的线程对象
new drawthread3(a,"小明").start();
new drawthread3(a,"小红").start();
//创建三个存钱的线程对象
new savethread(a,"存钱罐1号").start();
new savethread(a,"存钱罐2号").start();
new savethread(a,"存钱罐3号").start();
}
}
//存钱的线程类
class savethread extends Thread{
//接收处理的账户对象
private account3 acc;
public savethread(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//存钱
acc.savemoney(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//取钱的线程类
class drawthread3 extends Thread{
//接收处理的账户对象
private account3 acc;
public drawthread3(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//取钱
acc.drawmoney3(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class account3{
private String cartId;
private double money;//账户余额

public account3() {
}

public account3(String cartId, double money) {
this.cartId = cartId;
this.money = money;
}

public String getCartId() {
return cartId;
}

public void setCartId(String cartId) {
this.cartId = cartId;
}

public double getMoney() {
return money;
}

public void setMoney(double money) {
this.money = money;
}

public synchronized void savemoney(double money) {
//先获取是谁来存钱,线程名即是人名
String name=Thread.currentThread().getName();
//判断账户是否有钱
try {
if(this.money==0){
//没钱,存钱
this.money+=money;
System.out.println(name+"来存钱,存了:"+money+"存钱后余额为:"+this.money);
//有钱了
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}else {
//有钱,不存钱
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}

public synchronized void drawmoney3(double money) {
//先获取是谁来取钱,线程名即是人名
String name=Thread.currentThread().getName();
try {
//判断账户是否够钱
if(this.money>=money){
//有钱,取钱
this.money-=money;
System.out.println(name+"来取钱成功,取了:"+money+"余额是:"+this.money);
//没钱了
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}else{
//余额不足
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

以上就是Java实现线程通信的案例讲解的详细内容,更多关于Java线程通信的资料请关注脚本之家其它相关文章!

相关文章

    • 这篇文章主要介绍了intellij idea如何将web项目打成war包的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
      2020-07-07
    • 电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。本文详细为大家介绍了SpringBoot实现发送电子邮件功能的示例代码,需要的可以参考一下
      2022-09-09
    • 这篇文章主要为大家介绍了Elasticsearch中FST与前缀搜索应用实战解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2023-08-08
    • 这篇文章主要介绍了Java生成非对称型加密公钥和私钥的方法,涉及java非对称加密的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
      2015-07-07
    • 这篇文章主要给大家介绍了关于IDEA新建springboot项目时未生成pom.xml文件的解决操作方法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
      2023-02-02
    • openFeign 是springcloud对Feign进行了增强,使得Feign支持了springmvc的注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便,这篇文章主要介绍了springcloud 整合 openfeign,需要的朋友可以参考下
      2022-09-09
    • 这篇文章主要介绍了详解spring cloud整合Swagger2构建RESTful服务的APIs,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2018-01-01
    • 这篇文章主要介绍了Java中的IO读写原理,IO是指输入和输出操作的技术,它提供了一组用于读取和写入数据的类,以及用于处理字符和字节数据的接口,这些类和接口可以用于读取和写入文件、网络流、内存缓冲区等各种数据源和目标,需要的朋友可以参考下
      2023-08-08
    • 这篇文章主要为大家介绍了详解如何查看Elasticsearch的Debug日志,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2022-11-11
    • 这篇文章主要介绍了springboot中使用rabbitt,通过本文学习让我们了解如何在Spring Boot中使用RabbitMQ,并使用不同的交换机和队列类型以及消息确认模式,需要的朋友可以参考下
      2023-05-05

    最新评论