生产者消费者模式(吃包子例子)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

生产者消费者模式(吃包子例子)

生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的,使用生产者消费者模式的好处。

真实世界中的生产者消费者模式。生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)等待如果桌子空了的话。这里桌子就是一个共享的对象。在 Java Executor框架自身实现了生产者消费者模式它们分别负责添加和执行任务。

它的确是一种实用的设计模式,常用于编写多线程或并发代码。下面

是它的一些优点:

1它简化的开发,你可以独立地或并发的编写消费者和生产者,它仅仅只需知道共享对象是谁

2生产者不需要知道谁是消费者或者有多少消费者,对消费者来说也是一样

3生产者和消费者可以以不同的速度执行

4分离的消费者和生产者在功能上能写出更简洁、可读、易维护的代码

生产者消费者问题是一个流行的面试题,面试官会要求你实现生产者消费者设计模式,以至于能让生产者应等待如果队列或篮子满了的话,消费者等待如果队列或者篮子是空的。这个问题可以用不同的方式来现实,经典的方法是使用wait和notify方法在生产者和消费者线程中合作,在队列满了或者队列是空的条件下阻塞,Java5的阻塞队列(BlockingQueue)数据结构更简单,因为它隐含的提供了这些控制,虽然现在你不需要使用wait和nofity在生产者和消费者之间通信了,阻塞队列的put()方法将阻塞如果队列满了,队列take()方法将阻塞如果队列是空的。在下部分我们看看jdk5之前怎么用Java实现生产者和消费者模式。

下面我就用吃包子者例子

生产者:包子生产者(多个),一次生产一个包子,生产的时间是随机的

缓存区:装包子的篮子(一个),例子里我限定篮子最多能装5个,

篮子里面最上面的包子会被先吃掉,所以这用到了数据结构里面的栈,先进后出

消费者:吃包子的消费者(多个),一次只能吃个包子,吃的时间也是随机的

篮子满了生产者就不可以往篮子里放包子,必须得等到篮子不是满的篮子空了消费者不可以继续吃包子,得等到篮子有包子才能拿包子吃

相关文档
最新文档