- 浏览: 1346064 次
- 性别:
- 来自: 成都
-
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
Producer Consumer模式与 Guarded Suspension 模式 是类似的,只不过Guarded Suspension模式并不限制缓冲区的长度,Producer Consumer模式假设所生产的产品放置在一个长度有限制的缓冲区(就像是一个产品桌,它可以摆放的空间是有限的),如果缓冲区满了,则生产者必须停止继续将产品放到缓冲区中,直到消费者取走了产品而有了空间,而如果缓冲区中没有产品,当然消费者必须等待,直到有新的产品放到缓冲区中。
简单来说,Producer Consumer模式就像是加上了双重防护与等待的Guarded Suspension模式,而它的两个防护与等待的条件洽好相反,一个用Java实现的简单流程架构如下:
- ProductTable.java
import java.util.LinkedList; public class ProductTable { private LinkedList products = new LinkedList(); public synchronized void addProduct(Product product) { while(products.size() >= 2) { // 容量限制为 2 try { wait(); } catch(InterruptedException e) {} } products.addLast(product); notifyAll(); } public synchronized Product getProduct() { while(products.size() <= 0) { try { wait(); } catch(InterruptedException e) {} } Product product = (Product) products.removeFirst(); notifyAll(); return product; } }
以下举一个最简单的:生产者每次生产一个整数并放置在桌子上,而消费者消耗整数,桌子上一次只能放置一个整数,如果桌子上已有整数,则生产者等待消费者将整数消耗并通知生产者生产下一个整数,如果桌子上没有整数,则消费者等待生产者生产整数并通知消费者可以消耗整数。
- Producer.java
public class Producer extends Thread { private ProductTable productTable; public Producer(ProductTable productTable) { this.productTable = productTable; } public void run() { System.out.println("Produce integer......"); for(int product = 1; product <= 10; product++) { try { // wait for a random time Thread.sleep((int) Math.random() * 3000); } catch(InterruptedException e) { e.printStackTrace(); } productTable.setIntProduct(product); } } }
- Consumer.java
public class Consumer extends Thread { private ProductTable productTable; public Consumer(ProductTable productTable) { this.productTable = productTable; } public void run() { for(int i = 1; i <= 10; i++) { try { // wait for a random time Thread.sleep((int) (Math.random() * 3000)); } catch(InterruptedException e) { e.printStackTrace(); } productTable.getProductInt(); } } }
生产者将产品放至桌上,而消费者将产品从桌上取走,所以桌子是个维护是否让被放置或消耗产品的地方,由它来决定谁必须等待与通知:
- ProductTable.java
public class ProductTable { private int productInt = -1; // -1 for no product public synchronized void setIntProduct(int product) { if(productInt != -1) { try { wait(); } catch(InterruptedException e) { e.printStackTrace(); } } productInt = product; System.out.println("set (" + product + ")"); notify(); } public synchronized int getProductInt() { if(productInt == -1) { try { wait(); } catch(InterruptedException e) { e.printStackTrace(); } } int p = productInt; System.out.println("Get (" + productInt + ")"); productInt = -1; notify(); return p; } }
生产者会生产10个整数,而消费者会消耗10个整数,由于桌上只能放置一个整数,所以每生产一个就消耗一个。
发表评论
-
Java 事件传送技术
2010-12-20 14:16 1509developerWorks 中国 ... -
Design Pattern: Mediator 模式
2010-11-13 23:31 1297Mediator的意思是中介者、调节者、传递物,顾名思义,这个 ... -
Design Pattern: Command 模式
2010-11-13 23:30 1122如果您写过Java的Swing视窗程式,您可能使用过Comma ... -
Design Pattern: Strategy 模式
2010-11-13 23:25 1309考虑您要设计一个更换各种符号的工具类TextCharChang ... -
Design Pattern: State 模式
2010-11-13 23:22 1077如果您不了解TCP的连线方式,在看 Gof 的书介绍State ... -
Design Pattern: Read-Write-Lock 模式
2010-11-10 23:58 1197如果有一个资料档有可能同时间会有许多客户端对它进行读取与写入的 ... -
Design Pattern: Guarded Suspension 模式
2010-11-10 23:48 1151考虑这么一个伺服器,它可以处理来自多个客户端的服务请求(Req ... -
Design Pattern: Observer 模式
2010-11-10 23:33 1060Java深入到一定程度,就不可避免的碰到设计模式(design ... -
Design Pattern: Iterator 模式
2010-11-10 23:22 1112这个模式已经被整合入Java的Collection.在大多数场 ... -
Design Pattern: Interpreter 模式
2010-11-10 23:17 1305对于一个具有层次节点关系的问题来说,如果您要剖析每一个节点,您 ... -
Design Pattern: Command 模式
2010-11-10 23:08 1365Command定义n 将来自客户端的请求传入一个对象,无需了解 ... -
Design Pattern: Chain of Responsibility 模式
2010-11-10 23:00 1279其实Chain of Responsibility ... -
Design Pattern: Proxy 模式
2010-11-10 22:51 1619来看看实现代理的两种方式:Static Proxy与Dynam ... -
Design Pattern: Flyweight 模式
2010-11-10 22:48 1426Flyweight(享元)模式定义:避免大量拥有相同内容的小类 ... -
Design Pattern: Facade 模式
2010-11-10 22:42 1329Facade模式的定义: 为子系统中的一组接口提供一个一致的界 ... -
Design Pattern: Decorator 模式
2010-11-10 22:35 1367装饰模式:Decorator常被翻译成"装饰&quo ... -
Design Pattern: Bridge 模式
2010-11-10 22:24 1169Bridge模式定义 :将抽象 ... -
Design Pattern: Default Adapter 模式(二)
2010-11-10 22:16 1546适配器模式定义:将两个 ... -
Design Pattern: Default Adapter 模式
2010-11-10 22:07 1144在Java中如果要定义事件 ... -
Design Pattern: Singleton 模式
2010-11-10 22:06 1064Singleton的英文意义是独身,也就是只有一个人,应用在物 ...
相关推荐
良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...
观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到通知。 观察者模式...
**生产者-消费者模式(Producer-Consumer Pattern):** 这是一种经典的并发模式,用于处理生产者和消费者之间的数据交换问题。在这种模式下,生产者负责创建数据并将其放入队列,而消费者则从队列中取出数据进行...
6.7.5 Consumer-producer model 30 6.7.6 Hybrid model 32 6.7.7 Summary. 32 7 Supplementary Information. 1 7.1 Software and documentation. 1 7.2 Data for testing software installation. 2 7.3 ...
在LabVIEW等图形化编程环境中,"Producer/Consumer Design Pattern"(生产者-消费者模式)被广泛应用于此类模型的设计中。该模式允许生产者线程生成数据,而消费者线程处理这些数据,有效地利用了多核处理器的计算...