Java实践之路——多线程之生产者消费者模型
来源:互联网 发布:淘宝代练lol封号赔偿 编辑:程序博客网 时间:2024/05/29 09:10
一、环境
1、平台:MyEclipse8.5/JDK1.5
二、概述
1、目标:用java实现生产者消费者模型
2、生产者消费者模型描述
1)、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2)、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3)、当消费者发现仓储没产品可消费时候会通知生产者生产。
4)、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
三、开发调试
1、编写仓库代码,具体代码如下
package org.cyxl.thread;/** * 仓库 * @author cyxl * */public class Godown {private int max_size=100;//最大库存量private int curr_size=0;//当前库存量public Godown(){}public Godown(int max_size){this.max_size=max_size;}public int getMax_size() {return max_size;}public void setMax_size(int maxSize) {max_size = maxSize;}public int getCurr_size() {return curr_size;}public void setCurr_size(int currSize) {curr_size = currSize;}/** * 生产时增加库存量,注意同步 * @param size生产数量 */public synchronized void add(int size){while((this.curr_size+size)>this.max_size){System.out.println("生产"+size+"后"+(this.curr_size+size)+"超过了仓库的最大库存量"+this.max_size+",所以不生产");try {//仓满停止生产,直到可以生产为止this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.curr_size+=size;System.out.println("生产"+size+",当前库存量为"+curr_size);//唤醒所有该对象的其他线程,通知消费者消费this.notifyAll();}/** * 消费者减少库存量,注意同步 * @param size消费数量 */public synchronized void minus(int size){while(this.curr_size<size){System.out.println("库存量"+getCurr_size()+"不足"+size+",请联系生产");try {//数量不够一直等待,直到存库达到该数量this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.curr_size-=size;System.out.println("消费了"+size+",当前库存量为"+curr_size);//唤醒所有该对象的其他线程,通知生产者生产this.notifyAll();}}
2、编写消费者代码
package org.cyxl.thread;/** * 消费者 * @author cyxl * */public class Consumer implements Runnable{private Godown godown;//仓库private int num;//消费数量public Consumer(){}public Consumer(Godown godown,int num){this.godown=godown;this.num=num;}public Godown getGodown() {return godown;}public void setGodown(Godown godown) {this.godown = godown;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public void run() {//消费数量numgodown.minus(num);}}
3、编写生产者代码
package org.cyxl.thread;/** * 生产者 * @author cyxl * */public class Producer implements Runnable{private Godown godown;//仓库private int num;//生产数量public Godown getGodown() {return godown;}public void setGodown(Godown godown) {this.godown = godown;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public Producer(){}public Producer(Godown godown,int num){this.godown=godown;this.num=num;}public void run() {//生产数量numgodown.add(num);}}
4、编写销售者,销售者作为联系生产者、消费者和仓库的桥梁
package org.cyxl.thread;/** * 销售员 * @author Administrator * */public class Solder {public static void main(String[] args){//建一个容量为200的仓库Godown godown=new Godown(200);//消费者消费20Consumer c1=new Consumer(godown,20);Thread ct1=new Thread(c1);ct1.start();//消费者消费50Consumer c2=new Consumer(godown,50);Thread ct2=new Thread(c2);ct2.start();//生产者生产30Producer p1=new Producer(godown,30);Thread pt1=new Thread(p1);pt1.start();//生产者生产80Producer p2=new Producer(godown,80);Thread pt2=new Thread(p2);pt2.start();//消费者消费30Consumer c3=new Consumer(godown,30);Thread ct3=new Thread(c3);ct3.start();}}
5、测试结果
库存量0不足20,请联系生产库存量0不足50,请联系生产生产30,当前库存量为30库存量30不足50,请联系生产消费了20,当前库存量为10库存量10不足50,请联系生产生产80,当前库存量为90消费了50,当前库存量为40消费了30,当前库存量为10
四、总结
1、多线程特别应注意方法的同步
2、该程序涉及的知识点有多线程,线程同步,wait方法,notify方法或者notifyAll方法
3、以上测试的结果是随机的,但最后的结果是一定的,也就是最后的库存量为10
- Java实践之路——多线程之生产者消费者模型
- java多线程之生产者和消费者模型
- JAVA多线程之生产者消费者模型
- Java多线程之生产者消费者模型
- Java--多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- [Java]多线程之生产者消费者
- java多线程之生产者消费者
- Java多线程之生产者消费者
- Java 多线程之生产者消费者
- java多线程同步案例之--生产者消费者模型
- JAVA多线程之——经典面试消费者与生产者
- Java多线程之——生产者、消费者简单实现
- 多线程同步之生产者---消费者模型
- 多线程同步之生产者---消费者模型
- boost的简介与安装
- Hibernate 延迟加载部分集合、集合过滤session.createFilter
- 关于图的几个算法
- 把二元查找树转变成排序的双向链表
- php二维数数组二分查找
- Java实践之路——多线程之生产者消费者模型
- 4948E进入rommon模式处理方法
- GDI绘图(一)
- 程序猿 技术不是你的全部
- 批处理应用之设置JAVA环境变量
- css布局:父元素相对定位,子元素绝对定位
- 查询某区间内最靠右的不超过k的数
- log4j详解
- scripting.dictionary的完全研究