Java中设计模式之生产者消费者模式-3
来源:互联网 发布:海洋动态壁纸软件 编辑:程序博客网 时间:2024/06/05 21:13
引言
生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
生产者消费者模型
四个类
1.产品类:面包,饮料等
2.资源类(中介类):超市(买卖各种产品)
3.生产类(工厂类):生产各种产品
4.消费者类(顾客类):消费各种产品
代码:
1.产品类
package 设计模式之生产者消费者模式;public class Bread { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Bread [brand=" + brand + ", price=" + price + "]"; } public Bread(String brand, double price) { super(); this.brand = brand; this.price = price; } public Bread() { super(); }}
2.中介类(资源类):超市
负责统筹安排所有资源,是生产者和消费者的桥梁。类似多线程中的共享资源,各个线程来操作同一个资源。
package 设计模式之生产者消费者模式;public class Market {//假设超市买面包的容量为6(即面包货架容量为6) private Bread[] breads=new Bread[6]; int index=-1;// 为什么不默认为0 因为数组下标为0 是有一个数据的 //从工厂进面包 public synchronized void getBread(Bread bread){ //如果昨天生意不好,没有卖出面包,此时就不需要进货 if(index>=5){// 下标如果大于等于5 那就是有6个面包 工厂不需要生产 所以让工厂等着 try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //生意很好,卖出了面包,需要进货 // 为了不覆盖任何面包 需要先加 下标 后赋值 index++; //将进的面包放进数组里(货架上) breads[index]=bread; System.out.println("进了"+breads[index]); //进货后,(通知)让顾客消费 this.notify(); } // 卖面包 public synchronized void saleBread(){ //如果昨天生意很好,面包已经卖完了,那么顾客就需要等待 if(index<0){// 下标小于0 就证明是 数组中没有面包了 ,就让消费者等待 try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //有面包可以卖 // 卖了哪个面包 System.out.println("[卖了]"+breads[index]); // 卖完面包 下标自动减- index--; this.notify(); }}
3.工厂类
package 设计模式之生产者消费者模式;public class Factory implements Runnable { Market market; public Factory(Market market) { super(); this.market = market; } @Override public void run() { for(int i=0;i<80;i++){ market.getBread(new Bread("桃李牌"+i, 4.5)); } }}
4.消费者
package 设计模式之生产者消费者模式;public class Customer implements Runnable { Market market; public Customer(Market market){ this.market=market; } @Override public void run() { for(int i=0;i<80;i++){ market.saleBread(); } }}
测试类
package 设计模式之生产者消费者模式;public class Test { public static void main(String[] args){ Market market=new Market(); Factory factory=new Factory(market); Customer customer=new Customer(market); Thread thread=new Thread(factory,"生产者"); Thread thread2=new Thread(customer,"消费者"); thread.start(); thread2.start(); }}
0 0
- Java中设计模式之生产者消费者模式-3
- Java设计模式之生产者消费者模式
- java多线程设计模式之消费者生产者模式
- java之生产者消费者模式
- 设计模式之生产者-消费者模式
- 并发设计模式之生产者-消费者模式
- 设计模式之:生产者与消费者模式
- 并发设计模式之生产者-消费者模式
- Java多线程之并发协作生产者消费者设计模式
- Java多线程之并发协作生产者消费者设计模式
- Java多线程之并发协作生产者消费者设计模式
- Java多线程之并发协作生产者消费者设计模式
- Java多线程之并发协作生产者消费者设计模式
- 设计模式-生产者消费者模式
- 设计模式 - 生产者-消费者模式
- 设计模式--生产者消费者模式
- 设计模式-生产者消费者模式
- 设计模式-生产者与消费者Java实现
- Bean Validation 规范
- eclipse导出Jar包选项
- 谈android组件化之ARouter简单使用
- 蓝牙解析(part11):BLE SM(5):传统配对(Legacy Pairing):OOB
- linux编译boost
- Java中设计模式之生产者消费者模式-3
- fl2440——内核自带按键驱动的移植与测试
- Linux系统中安装和简易配置redis
- 【LeetCode】【Python】8. String to Integer (atoi)
- 表格如何去除边框以及分割线
- Qt中IEEE754格式转换为浮点数方法
- Android Annotation注解使用说明
- java中对象相等(equal)
- 调用微信js-sdk(‘分享给朋友‘为例)