多线程设计模式之——Producer-Consumer Pattern

转载 2013年02月28日 12:36:19
此模式是在生产者与消费者之间加入一个“桥梁参与者”来缓冲线程之间的处理速度差。一般可以存在多个生产者与消费者,但当双方都只有一个的时候,又称为Pipe Pattern。 

例子:假设有2个生产者,2个消费者,仓库里只能放4个产品。(这里的产品就是String类型的名字而已) 


Java代码  收藏代码
  1. //Storage.java  
  2. public class Storage {  
  3.     private String[] buffer;  
  4.     private int head;//取走一个商品的位置  
  5.     private int tail;//存入一个商品的位置  
  6.     private int count;//buffer内的商品数量  
  7.       
  8.     public Storage(int count){  
  9.         this.buffer = new String[count];  
  10.         this.count = 0;  
  11.         this.head = 0;  
  12.         this.tail = 0;  
  13.     }  
  14.       
  15.     //这里的if警戒条件就运用了Guarded Suspension Pattern,要求不满足条件,便等待  
  16.     public synchronized void put(String goods) throws InterruptedException{  
  17.         System.out.println(Thread.currentThread().getName() + " produce the goods:" + goods);  
  18.         if(count >= buffer.length){  
  19.             System.out.println("the storage is full!");  
  20.             wait();  
  21.         }  
  22.         buffer[tail] = goods;  
  23.         tail = (tail + 1) % buffer.length;  
  24.         count++;  
  25.         notifyAll();  
  26.     }  
  27.       
  28.     public synchronized String get() throws InterruptedException{  
  29.         if(count <= 0){  
  30.             System.out.println("the storage is empty!");  
  31.             wait();  
  32.         }  
  33.         String goods = buffer[head];  
  34.         head = (head + 1) % buffer.length;  
  35.         count--;  
  36.         notifyAll();  
  37.         System.out.println(Thread.currentThread().getName() + " consume the goods:" + goods );  
  38.         return goods;  
  39.     }  
  40.   
  41. }  




Java代码  收藏代码
  1. //ProducerThread.java  
  2. import java.util.Random;  
  3.   
  4.   
  5. public class ProducerThread extends Thread {  
  6.     private Storage storage;  
  7.     private Random random;  
  8.     private static int pid;  //产品编号  
  9.       
  10.     public ProducerThread(String name , Storage storage){  
  11.         super(name);  
  12.         this.storage = storage;  
  13.         this.random = new Random();  
  14.     }  
  15.       
  16.     public void run(){  
  17.         try{  
  18.             for(int i=0; i<10; i++){  
  19.                 Thread.sleep(random.nextInt(1000));//模拟生产时间  
  20.                 String goods = getName() + " produce the goods" + nextPId();  
  21.                 storage.put(goods);  
  22.             }  
  23.         }catch(InterruptedException e){  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.       
  28.     private static synchronized int nextPId(){  
  29.         return pid++;  
  30.     }  
  31.   
  32. }  




Java代码  收藏代码
  1. //ConsumerThread.java  
  2. import java.util.Random;  
  3.   
  4.   
  5. public class ConsumerThread extends Thread {  
  6.     private Storage storage;  
  7.     private Random random;  
  8.       
  9.     public ConsumerThread(String name , Storage storage){  
  10.         super(name);  
  11.         this.random = new Random();  
  12.         this.storage = storage;  
  13.     }  
  14.       
  15.     public void run(){  
  16.         try{  
  17.             while(true){  
  18.                 storage.get();  
  19.                 Thread.sleep(random.nextInt(2000));//模拟商品使用时间  
  20.             }  
  21.         }catch(InterruptedException e){  
  22.             e.printStackTrace();  
  23.         }  
  24.     }  
  25.   
  26. }  




Java代码  收藏代码
  1. //Main.java  
  2. public class Main {  
  3.   
  4.     public static void main(String[] args) {  
  5.         Storage storage = new Storage(4);  
  6.         new ProducerThread("producer_lulu01" , storage).start();  
  7.         new ProducerThread("producer_lulu02" , storage).start();  
  8.         new ConsumerThread("consumer_fang01" , storage).start();  
  9.         new ConsumerThread("consumer_fang02" , storage).start();  
  10.           
  11.   
  12.     }  
  13.   
  14. }  
<script type="text/javascript"><!-- google_ad_client = "ca-pub-1944176156128447"; /* cnblogs 首页横幅 */ google_ad_slot = "5419468456"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

Java多线程:Producer-Consumer不同的几种实现方式

生产者消费者问题是一个典型的线程同步问题。 主要有如下实现方式: wait() notifyAll() class Queue { //共享队列的目的用于...
  • langjian2012
  • langjian2012
  • 2015年03月22日 20:55
  • 1223

Java 多线程设计模式之Producer-Consumer

Producer-Consumer 模式通过在数据的生产者和消费者之间引入一个通道(Channel, 暂时可以将其简单地理解为一个队列)对二者进行解耦(Decouping):生产者将其生产的数据放入通...
  • lilele12211104
  • lilele12211104
  • 2017年12月08日 11:10
  • 30

Java多线程:Producer-Consumer不同的几种实现方式

生产者消费者问题是一个典型的线程同步问题。 主要有如下实现方式: wait() notifyAll() class Queue { //共享队列的目的用于...
  • langjian2012
  • langjian2012
  • 2015年03月22日 20:55
  • 1223

设计模式(创建型)之原型模式(Prototype Pattern)

要理解原型原型模式必须先理解Java里的浅复制和深复制。有的地方,复制也叫做克隆。Java提供这两种克隆方式。 因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一...
  • yanbober
  • yanbober
  • 2015年04月29日 11:28
  • 2871

多线程设计模式——最后总结

多线程设计模式 最后总结
  • buyoufa
  • buyoufa
  • 2016年07月16日 14:55
  • 618

"围观"设计模式(21)--行为型之状态模式(State Pattern)

状态模式--允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。----百度百科 个人理解 状态模式应该说可以理解为某种状态下,程序的执行流程可能会发生变化,类...
  • wangyang1354
  • wangyang1354
  • 2016年06月13日 15:11
  • 3411

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016年08月12日 12:10
  • 3799

Java设计模式——策略模式(Strategy Pattern)

Java设计模式——策略模式(Strategy Pattern) 场景一 描述:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,...
  • u012401711
  • u012401711
  • 2016年09月07日 21:16
  • 993

23种设计模式之python实现--Adapter模式

截至上一篇我们已经把创建型的设计模式实现了,从这篇blog开始,就是结构型的模式了,第一篇就写适配器模式吧。 Adapter模式有两种实现方式一种是类方式。 #理解 #就是电源适配器的原理吧,将本...
  • apple_boys
  • apple_boys
  • 2014年04月02日 22:00
  • 1105

设计模式-----COMMAND模式

COMMAND模式是最简单,最优雅的设计模式之一。COMMAND模式的使用范围非常宽广。 COMMAND模式通过对命令的封装接触了系统的逻辑互联关系和实际连接的设备之间的耦合。简单的说就是COMMA...
  • u013812682
  • u013812682
  • 2016年11月28日 16:44
  • 275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程设计模式之——Producer-Consumer Pattern
举报原因:
原因补充:

(最多只允许输入30个字)