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(); } }
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() { //消费数量num godown.minus(num); } }
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() { //生产数量num godown.add(num); } }
package org.cyxl.thread; /** * 销售员 * @author Administrator * */ public class Solder { public static void main(String[] args) { //建一个容量为200的仓库 Godown godown=new Godown(200); //消费者消费20 Consumer c1=new Consumer(godown,20); Thread ct1=new Thread(c1); ct1.start(); //消费者消费50 Consumer c2=new Consumer(godown,50); Thread ct2=new Thread(c2); ct2.start(); //生产者生产30 Producer p1=new Producer(godown,30); Thread pt1=new Thread(p1); pt1.start(); //生产者生产80 Producer p2=new Producer(godown,80); Thread pt2=new Thread(p2); pt2.start(); //消费者消费30 Consumer c3=new Consumer(godown,30); Thread ct3=new Thread(c3); ct3.start(); } }
库存量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