如果没记错在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();
}
}
分享到:
相关推荐
`ProducerAndConsumer.zip`中的代码可能包含一个简单的Java实现,生产者类(Producer)和消费者类(Consumer)分别继承自Thread类,它们共享一个`BlockingQueue`实例。生产者类的run方法不断生成数据并调用`queue....
在本文中,我们将深入探讨如何在集群模式下模拟Kafka的生产者和消费者。Kafka是一种分布式流处理平台,常用于大数据实时处理和消息传递。它由Apache开发,以其高吞吐量、低延迟和可扩展性而闻名。 首先,我们要理解...
本实例将深入探讨 Kafka 的核心概念——生产者和消费者,以及它们在实际应用中的工作原理。 Kafka 是一个高吞吐量、低延迟的分布式发布订阅消息系统,最初由 LinkedIn 开发,并于2011年开源。它设计的目标是能够...
在这个“java IBM MQ 7.5.0 生产者和消费者实例”中,我们将探讨如何使用Java编程语言与IBM MQ 7.5.0版本进行交互,创建生产者和消费者应用。 1. **IBM MQ安装与配置**: 在开始编程之前,首先需要在本地或服务器...
这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既不会因为生产过快而导致资源浪费,也不会因为消费过快而使生产者空闲。 生产者-消费者问题通常...
### Java生产者与消费者模型详解 ...实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个生产者与三个消费者之间的数据同步交互,验证了生产者-消费者模式的有效性和可行性。
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`...理解并掌握生产者与消费者模式有助于编写高效、可靠的多线程应用程序。
Java生产者消费者模式实例分析 Java生产者消费者模式是一种常见的设计模式,它广泛应用于Java多线程编程中。该模式主要由三个部分组成:生产者、消费者和缓存。下面对Java生产者消费者模式的相关组成、原理及实现...
在本示例"bcb 多线程示例 MutilThread(生产者与消费者)"中,我们将探讨 Borland C++ Builder (bcb) 平台上的线程应用,特别是生产者-消费者问题的解决方案。 生产者-消费者问题是多线程编程中的一个经典案例,它...
生产者消费者模式是一种经典的多线程同步模型,用于在并发环境中协调生产者和消费者之间的数据交换。在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的UI支持和线程管理功能来实现这一模式。本...
Java多线程中的生产者-消费者模式是一种典型的同步与协作模型,它用于解决在多线程环境下资源的有效利用和协调问题。在这个模式中,通常有两个角色:生产者和消费者。生产者负责创建产品,而消费者则负责消费这些...
生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...
- **结果验证**:通过观察运行结果,如缓冲区状态的变化、线程的执行顺序等,可以验证生产者与消费者模式是否正确实现,以及同步机制是否有效防止了数据竞争和死锁现象。 ### 结论 生产者与消费者模式不仅是一个...
至于`PC`这个文件,可能是另一个与生产者消费者模式相关的类或接口,但具体功能需要查看代码才能确定。它可能代表了某种特定类型的生产者或消费者,或者是对生产者消费者模式的抽象。 总的来说,这个Java课程设计...
在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...
1. 生产者线程:它将创建一个`QSemaphore`实例,用于限制消费者的数量。当生产数据时,会先调用`QSemaphore::acquire()`减少信号量计数,表示占用一个资源(即消费者线程)。完成后,通过调用`QSemaphore::release()...
5. **设计模式**:生产者消费者模型可以看作是一种“生产者-消费者”设计模式的实例,它属于行为设计模式,用于协调异步处理和共享资源。此外,还可以结合观察者模式,让消费者订阅生产者,当有新数据时,生产者通知...
总之,多生产者-多消费者模式是并发编程中的重要设计模式,通过合理利用同步机制,能够有效地解决线程间的通信问题,提高系统的并发性能。在Java中,我们可以借助`BlockingQueue`等工具实现这一模式,从而构建高效、...
在Java中,我们可以使用`java.util.concurrent`包下的`BlockingQueue`来实现生产者消费者模式。`BlockingQueue`是一个线程安全的队列,它提供了在满时阻塞生产者,空时阻塞消费者的能力,从而实现线程间的同步。 ...