功能:模拟生产和消费。生产者向ArrayList集合添加数据,数据大于等于10个时停止添加,唤醒所有等待的消费者线程。

类:PublicVar    java的面对对象思想,将"货物"抽象成类,类里放着"货物"的参数ArrayList

public class PublicVar {public ArrayList<Integer> arrayList=new ArrayList<Integer>();
}

类:Product    模拟生产者类,添加数据,只有一个构造方法,必须传一个PublicVar类的对象,实质是传一个PublicVar类的地址从而实现和其他类共同操作一个对象。因为是同步方法所以不用担心原子性问题。

生产"货物"并打印信息,当"货物"里的值大于等于10个时,唤醒所有等待的线程,然后自身挂起进入等待状态。因为有多个消费者所以一般情况都是唤醒所有锁的等待线程,因为线程多的时候会不清楚到底有几个线程在等,而等待的线程会按照调用wai()方法的顺序进入一个等待线程,notify()会唤醒等待队里中最先等待的线程,notifAll()则是唤醒所有等待的线程,之后的CPU执行权应该给谁是随机的,谁先拿到锁就给谁。

public class Product extends Thread{private PublicVar publicVar;int count;public Product(PublicVar publicVar) {this.publicVar=publicVar;}@Overridepublic void run() {try {while(true){synchronized ("123") {if (publicVar.arrayList.size()>=10) {"123".notifyAll();"123".wait();}else {publicVar.arrayList.add(count);System.out.println("生产者"+Thread.currentThread().getName()+"正在生产"+publicVar.arrayList.size()+"号货物");}}}} catch (Exception e) {// TODO: handle exception}}
}

类:Customer    模拟消费者类,获取数据,构造方法也是只有一个必须传递一个PublicVar的对象,从而实现多个线程对一个对象操作。和生产者是同一个锁(官方API叫监视器,实际上是加载时对象头几个字节中的某几个标志位,这里的锁都是“123”这个字符串,字符串也是也是对象,所以调用"123".wait()的方法就会获取到这个对象锁)。

当"货物"没有值时自身就会唤醒等待"123"锁的线程,因为这里只有一个生产者所以notify()是可以的,然后自身再挂起。

public class Customer extends Thread{private PublicVar publicVar;public Customer(PublicVar publicVar) {this.publicVar=publicVar;}@Overridepublic void run() {try {while(true){synchronized ("123") {if (publicVar.arrayList.size()==0) {       "123".notify();"123".wait();}else {System.out.println("消费者"+Thread.currentThread().getName()+"在消费"+publicVar.arrayList.size()+"号货物");publicVar.arrayList.remove(publicVar.arrayList.size()-1);}}}} catch (Exception e) {// TODO: handle exception}}
}

类 Test    测试类

public class Test {public static void main(String[] args) {PublicVar publicVar=new PublicVar();Customer customer=new Customer(publicVar);Customer customer2=new Customer(publicVar);Product product=new Product(publicVar);customer.setName("1号");customer2.setName("2号");product.setName("1号");product.start();customer.start();customer2.start();}
}

结果:可以看出两个消费者都有可能获取到数据

java多线程通信生产者和消费者简单例子相关推荐

  1. Java多线程技术~生产者和消费者问题

    Java多线程技术~生产者和消费者问题 本文是上一篇文章的后续,详情点击该连接 线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取 ...

  2. 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列

    目录 简介 一对一生产和消费:一只母鸡和叫练 wait/notify Lock条件队列 多对多生产和消费:2只母鸡和叫练/叫练媳妇 wait/notifyAll Lock条件队列 Lock和synch ...

  3. java多线程之——生产者和消费者(详解及提高)

    目录 前情引入 简单介绍 预备知识 代码及详解 简单代码 基本解释 生产者线程类 消费者线程类 测试类 执行流程 控制台输出 自我提高 问题一 问题二 升级代码 总结 前情引入 做一些简单的认识和告知 ...

  4. java多线程之生产者和消费者问题

    线程通信:不同的线程执行不同的任务,如果这些任务有某种关系,线程之间必须能够通信,协调完成工作. 经典的生产者和消费者案例(Producer/Consumer): 分析案例: 1):生产者和消费者应该 ...

  5. Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)

    文章目录 一.进程和线程 1.进程 2.线程 3.进程与线程的区别 二.生产者和消费者模型 1.生产者消费者模式概述 2.奶箱类 3.生产者类 4.消费者类 三.测试 1.测试类(BoxDemo) 2 ...

  6. 多线程通信—生产者和消费者模式

    1.队列Queue: 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者 ...

  7. java多线程:线程间的通信-生产者和消费者(三)

    在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...

  8. 多线程的实际应用-生产者与消费者的例子

    多线程的实际应用-生产者与消费者的例子 最近在恶补java多线程的相关知识,正好<java高手真经>课后有一道类似的题目,就拿过来编了一下,在纠结了一阵后,终于写完了,虽然中途瞄了好几眼前 ...

  9. Java并发编程系列18:多线程之生产者和消费者模式_信号灯法(wait/notify通知机制)

    1.生产者消费者模式 生产者消费者问题(Producer-consumer problem),也称为有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...

  10. java程序假死_分析一个常见的java多线程通信问题(假死现象)

    一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了.对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的.在这篇 ...

最新文章

  1. 029 浏览器不能访问虚拟机的问题解决
  2. Makefile_05:Make命令的自动推导
  3. js String方法集合
  4. 现在还有必要学Java开发吗?前景好吗?
  5. c# u盘使用记录_C# 系统应用之通过注册表获取USB使用记录(一)
  6. vue cli vue 3.x
  7. 嵌入式 c语言 面试题,嵌入式面试题-持续更新
  8. wdm设备驱动程序开发pdf_DWDM是什么 DWDM相关设备功能介绍【图文】
  9. 怎么样获取浏览器“该页无法显示”这类的异常 - -
  10. 正式开通我的开源博客
  11. ECharts项目小结~
  12. EdrawMax Crack,多合一的图表应用程序
  13. 计算机无法安装蓝牙驱动,windows10系统安装蓝牙驱动图文教程|windows10系统如何安装蓝牙驱动...
  14. Tensorflow中PRelu实现细节
  15. DSP控制的电力线通信模拟前端接口设计
  16. qq邮箱foxmail imap服务器,Foxmail如何设置IAMP邮箱
  17. [课业] 25 | 数据库基础 | 基础SQL查询语言
  18. 天辰的救赎(JS)第三章(胖虎的指引)
  19. 用户场景分析的四要素是什么?
  20. PTA - 数据库合集21

热门文章

  1. 图像空域增强:灰度映射法
  2. 蒙特卡洛估值几种不同的计算方式(Python)
  3. 容器技术Docker K8s 51 容器镜像服务(ACR)详解-进阶
  4. 阿里云云计算 22 VPC连接
  5. iOS build 编译错误 Failed to emit precompiled header for bridging header
  6. 高德地图如何取消订单_一文教你如何爬取高德地图
  7. 2021-09-13Top-N 推荐系统,通常指的是个性化推荐系统,有别于热门推荐。
  8. 用eclipse无法打开html里用绝对路径添加的图片但是在外面可以打开的解决方法
  9. 经历一番波折后的fedora以及wireshark
  10. rmi 反序列化漏洞_Java反序列化漏洞自动挖掘方法