java多线程通信生产者和消费者简单例子
功能:模拟生产和消费。生产者向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多线程通信生产者和消费者简单例子相关推荐
- Java多线程技术~生产者和消费者问题
Java多线程技术~生产者和消费者问题 本文是上一篇文章的后续,详情点击该连接 线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取 ...
- 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列
目录 简介 一对一生产和消费:一只母鸡和叫练 wait/notify Lock条件队列 多对多生产和消费:2只母鸡和叫练/叫练媳妇 wait/notifyAll Lock条件队列 Lock和synch ...
- java多线程之——生产者和消费者(详解及提高)
目录 前情引入 简单介绍 预备知识 代码及详解 简单代码 基本解释 生产者线程类 消费者线程类 测试类 执行流程 控制台输出 自我提高 问题一 问题二 升级代码 总结 前情引入 做一些简单的认识和告知 ...
- java多线程之生产者和消费者问题
线程通信:不同的线程执行不同的任务,如果这些任务有某种关系,线程之间必须能够通信,协调完成工作. 经典的生产者和消费者案例(Producer/Consumer): 分析案例: 1):生产者和消费者应该 ...
- Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)
文章目录 一.进程和线程 1.进程 2.线程 3.进程与线程的区别 二.生产者和消费者模型 1.生产者消费者模式概述 2.奶箱类 3.生产者类 4.消费者类 三.测试 1.测试类(BoxDemo) 2 ...
- 多线程通信—生产者和消费者模式
1.队列Queue: 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者 ...
- java多线程:线程间的通信-生产者和消费者(三)
在一个程序中,往往会通过多个线程协同来共同完成一项任务,线程间必然需要进行信息的传递,也即是进程间的通信,我们用生产者和消费者的例子来具体分析: 对于生产者和消费者之间的关系,他们都是针对同一资源的操 ...
- 多线程的实际应用-生产者与消费者的例子
多线程的实际应用-生产者与消费者的例子 最近在恶补java多线程的相关知识,正好<java高手真经>课后有一道类似的题目,就拿过来编了一下,在纠结了一阵后,终于写完了,虽然中途瞄了好几眼前 ...
- Java并发编程系列18:多线程之生产者和消费者模式_信号灯法(wait/notify通知机制)
1.生产者消费者模式 生产者消费者问题(Producer-consumer problem),也称为有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...
- java程序假死_分析一个常见的java多线程通信问题(假死现象)
一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了.对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的.在这篇 ...
最新文章
- 029 浏览器不能访问虚拟机的问题解决
- Makefile_05:Make命令的自动推导
- js String方法集合
- 现在还有必要学Java开发吗?前景好吗?
- c# u盘使用记录_C# 系统应用之通过注册表获取USB使用记录(一)
- vue cli vue 3.x
- 嵌入式 c语言 面试题,嵌入式面试题-持续更新
- wdm设备驱动程序开发pdf_DWDM是什么 DWDM相关设备功能介绍【图文】
- 怎么样获取浏览器“该页无法显示”这类的异常 - -
- 正式开通我的开源博客
- ECharts项目小结~
- EdrawMax Crack,多合一的图表应用程序
- 计算机无法安装蓝牙驱动,windows10系统安装蓝牙驱动图文教程|windows10系统如何安装蓝牙驱动...
- Tensorflow中PRelu实现细节
- DSP控制的电力线通信模拟前端接口设计
- qq邮箱foxmail imap服务器,Foxmail如何设置IAMP邮箱
- [课业] 25 | 数据库基础 | 基础SQL查询语言
- 天辰的救赎(JS)第三章(胖虎的指引)
- 用户场景分析的四要素是什么?
- PTA - 数据库合集21
热门文章
- 图像空域增强:灰度映射法
- 蒙特卡洛估值几种不同的计算方式(Python)
- 容器技术Docker K8s 51 容器镜像服务(ACR)详解-进阶
- 阿里云云计算 22 VPC连接
- iOS build 编译错误 Failed to emit precompiled header for bridging header
- 高德地图如何取消订单_一文教你如何爬取高德地图
- 2021-09-13Top-N 推荐系统,通常指的是个性化推荐系统,有别于热门推荐。
- 用eclipse无法打开html里用绝对路径添加的图片但是在外面可以打开的解决方法
- 经历一番波折后的fedora以及wireshark
- rmi 反序列化漏洞_Java反序列化漏洞自动挖掘方法