`
ku_sunny
  • 浏览: 38644 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

生产者与消费者模式 实例

阅读更多

    如果没记错在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();




}



}

 

0
0
分享到:
评论

相关推荐

    生产者与消费者实例代码,线程学习必备

    `ProducerAndConsumer.zip`中的代码可能包含一个简单的Java实现,生产者类(Producer)和消费者类(Consumer)分别继承自Thread类,它们共享一个`BlockingQueue`实例。生产者类的run方法不断生成数据并调用`queue....

    kafka模拟生产者消费者(集群模式)实例

    在本文中,我们将深入探讨如何在集群模式下模拟Kafka的生产者和消费者。Kafka是一种分布式流处理平台,常用于大数据实时处理和消息传递。它由Apache开发,以其高吞吐量、低延迟和可扩展性而闻名。 首先,我们要理解...

    kafka生产者消费者实例

    本实例将深入探讨 Kafka 的核心概念——生产者和消费者,以及它们在实际应用中的工作原理。 Kafka 是一个高吞吐量、低延迟的分布式发布订阅消息系统,最初由 LinkedIn 开发,并于2011年开源。它设计的目标是能够...

    java IBM MQ 7.5.0 生产者和消费者实例

    在这个“java IBM MQ 7.5.0 生产者和消费者实例”中,我们将探讨如何使用Java编程语言与IBM MQ 7.5.0版本进行交互,创建生产者和消费者应用。 1. **IBM MQ安装与配置**: 在开始编程之前,首先需要在本地或服务器...

    多线程实例,关于生产者与消费者的问题

    这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既不会因为生产过快而导致资源浪费,也不会因为消费过快而使生产者空闲。 生产者-消费者问题通常...

    java生产者与消费者实验报告

    ### Java生产者与消费者模型详解 ...实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个生产者与三个消费者之间的数据同步交互,验证了生产者-消费者模式的有效性和可行性。

    生产者与消费者 java实现

    生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`...理解并掌握生产者与消费者模式有助于编写高效、可靠的多线程应用程序。

    Java生产者消费者模式实例分析

    Java生产者消费者模式实例分析 Java生产者消费者模式是一种常见的设计模式,它广泛应用于Java多线程编程中。该模式主要由三个部分组成:生产者、消费者和缓存。下面对Java生产者消费者模式的相关组成、原理及实现...

    bcb 多线程示例 MutilThread(生产者与消费者)

    在本示例"bcb 多线程示例 MutilThread(生产者与消费者)"中,我们将探讨 Borland C++ Builder (bcb) 平台上的线程应用,特别是生产者-消费者问题的解决方案。 生产者-消费者问题是多线程编程中的一个经典案例,它...

    vs2017+mfc动画形式演示生产者消费者(单生产者单消费者,多生产者多消费者等)

    生产者消费者模式是一种经典的多线程同步模型,用于在并发环境中协调生产者和消费者之间的数据交换。在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的UI支持和线程管理功能来实现这一模式。本...

    Java多线程 生产者-消费者模式

    Java多线程中的生产者-消费者模式是一种典型的同步与协作模型,它用于解决在多线程环境下资源的有效利用和协调问题。在这个模式中,通常有两个角色:生产者和消费者。生产者负责创建产品,而消费者则负责消费这些...

    生产者-消费者.zip

    生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...

    操作系统-生产者与消费者

    - **结果验证**:通过观察运行结果,如缓冲区状态的变化、线程的执行顺序等,可以验证生产者与消费者模式是否正确实现,以及同步机制是否有效防止了数据竞争和死锁现象。 ### 结论 生产者与消费者模式不仅是一个...

    java生产者消费者图形界面模拟

    至于`PC`这个文件,可能是另一个与生产者消费者模式相关的类或接口,但具体功能需要查看代码才能确定。它可能代表了某种特定类型的生产者或消费者,或者是对生产者消费者模式的抽象。 总的来说,这个Java课程设计...

    Java JDK1.5 生产消费者模式解决方案

    在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...

    Qt中使用QSemaphore,单生产者—多消费者模型

    1. 生产者线程:它将创建一个`QSemaphore`实例,用于限制消费者的数量。当生产数据时,会先调用`QSemaphore::acquire()`减少信号量计数,表示占用一个资源(即消费者线程)。完成后,通过调用`QSemaphore::release()...

    java生产者消费者模型

    5. **设计模式**:生产者消费者模型可以看作是一种“生产者-消费者”设计模式的实例,它属于行为设计模式,用于协调异步处理和共享资源。此外,还可以结合观察者模式,让消费者订阅生产者,当有新数据时,生产者通知...

    多线程间通信:多生产者-多消费者实例

    总之,多生产者-多消费者模式是并发编程中的重要设计模式,通过合理利用同步机制,能够有效地解决线程间的通信问题,提高系统的并发性能。在Java中,我们可以借助`BlockingQueue`等工具实现这一模式,从而构建高效、...

    生产者消费者问题

    在Java中,我们可以使用`java.util.concurrent`包下的`BlockingQueue`来实现生产者消费者模式。`BlockingQueue`是一个线程安全的队列,它提供了在满时阻塞生产者,空时阻塞消费者的能力,从而实现线程间的同步。 ...

Global site tag (gtag.js) - Google Analytics