如果没记错在gof的23种设计模式里面并没有涉及到生产者与消费者模式,记得很就以前有个面试官叫我讲解下生产者与消费者模式,当时我就闷了,我就一直不停的在记忆中从23种模式搜索,结果无论如何都是想不起来,所以很尴尬了。
好吧,废话不多说
有这样一个饭店,他有一个厨师和一个服务员。这个服务员必须等待厨师准备好膳食。当厨师准备好时,他会通知服务员,之后服务员上菜,然后返回继续等待。这是一个协作的示例:两个任务必须在膳食被生产和消费时进行握手,厨师是生产者,服务员是消费者,而系统必须有序的方式关闭。
以下是代码,比较简单的一个小例子。
Meal.java
package com.cs.model;
/**
* 膳食
* @author chinasoft
*
*/
public
class Meal {
private
final
int
orderNum;
public Meal(int orderNum) {
this.orderNum = orderNum;
}
@Override
public String toString() {
return
"meal" + orderNum;
}
}
Chef .java
package com.cs.person;
import java.util.concurrent.TimeUnit;
import com.cs.model.Meal;
import com.cs.run.Restaurant;
/**
* 厨师
* @author chinasoft
*
*/
public
class Chef implements Runnable {
private Restaurant restaurant;
private
int
count = 0;
public Chef(Restaurant restaurant) {
this.restaurant = restaurant;
}
@Override
public
void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
while (restaurant.meal != null) {
System.out.println("Chef wait");
wait();
}
}
if (++count == 10) {
System.out.println("out food is closing");
restaurant.exec.shutdownNow();
}
System.out.println("Order up!");
synchronized (restaurant.waitPerson) {
restaurant.meal = new Meal(count);
restaurant.waitPerson.notifyAll();
}
//由于生产者提供的较快
可以让他速度慢点,以免出现等待现象
TimeUnit.MICROSECONDS.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("Chef interrupted");
}
}
}
WaitPerson.java
package com.cs.person;
import com.cs.run.Restaurant;
/**
* 服务员
* @author chinasoft
*
*/
public
class WaitPerson implements Runnable {
private Restaurant restaurant;
public WaitPerson(Restaurant restaurant) {
this.restaurant = restaurant;
}
@Override
public
void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
while (restaurant.meal == null)
wait();
}
System.out.println("WaitPerson got" + restaurant.meal);
synchronized (restaurant.chef) {
restaurant.meal = null;
//这里理论上是调用notify(),但是,在更复杂的情况下,可能有多个任务给对象上锁
//而你不知道是哪个任务,所以调用notifyAll更加安全
restaurant.chef.notifyAll();
}
}
} catch (InterruptedException e) {
System.out.println("waitPerson interrupt");
}
}
}
Restaurant.java
package com.cs.run;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.cs.model.Meal;
import com.cs.person.Chef;
import com.cs.person.WaitPerson;
/**
* 餐厅
* @author chinasoft
*
*/
public
class Restaurant {
public Meal meal;
public Chef chef = new Chef(this);
public WaitPerson waitPerson = new WaitPerson(this);
/** 执行线程池*/
public ExecutorService exec = Executors.newCachedThreadPool();
public Restaurant() {
exec.execute(chef);
exec.execute(waitPerson);
}
public
static
void main(String[] args) {
new Restaurant();
}
}
分享到:
相关推荐
多线程实例,关于生产者与消费者的问题 多线程实例,关于生产者与消费者的问题
读《深入理解计算机系统》后,参照书中程序,用C代码实现生产者消费者模型,本代码可移植性强,各接口以封装好,并有注释
kafka模拟生产者、消费者,集群模式,若是单机版,将ip端口组改为相应ip端口即可;
主要介绍了Java生产者消费者模式,结合实例形式分析了java生产者消费者模式的相关组成、原理及实现方法,需要的朋友可以参考下
在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,生产者负责往仓库了进商 品,而消费者负责从仓库里拿商品,这就构成了生产者消费者模型。结构图如下: 生产者消费者模型的优点: 1、解耦 假设生产者和...
本文实例分析了Python自定义进程池。分享给大家供大家参考,具体如下: 代码说明一切: ...#消费者 class Consumer(Process): def __init__(self, queue, ioLock): super(Consumer, self).__init__() self.q
主要介绍了详解Python 模拟实现生产者消费者模式的实例的相关资料,这里使用了线程知识,队列知识及循环的知识,需要的朋友可以参考下
主要介绍了python条件变量之生产者与消费者操作,结合具体实例形式分析了Python条件变量的概念、原理、及线程操作的相关技巧,需要的朋友可以参考下
通过synchronized关键字实现生产者消费者同步。 其中,有运用到工厂模式,并在该模式中,同样实现了实例的同步
主要介绍了Python生成器实现简单"生产者消费者"模型代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java多线程并发生产者消费者设计模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
通过实例VI 讲解labview 的三种设计模式,生产消费者模式、事件状态机、状态机模式。
本文实例讲述了C#多线程学习之生产者和消费者用法。分享给大家供大家参考。具体实分析如下: 前面的文章说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是...
#生产者消费者模型 其实服务器集群就是这个模型 # 这里介绍的是非yield方法实现过程 import threading,time import queue q = queue.Queue(maxsize=10) def Producer(anme): # for i in range(10): # q.put('骨头%...
观察者模式在消息的生产者和消费者之间建立了clean interface,这样就使得消息的生产者和消费者之间的耦合是抽象的。被观察者可以不认识任何一个的观察者,它只知道他们都实现了一个共同的接口。由于观察者和被观察...
实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 模仿QQ空间的电子相册 409 实例140 会动的七彩文字 413 实例141 ...
面向对象思想 单子模式 多线程示例银行取款问题 多线程示例生产者和消费者问题 编程实现序列化
通过controller类访问,写了queue模式,topic模式和广播模式的例子,可直接运行,有生产者和消费者,仅供学习之用。