考虑一个场景:一个饭店有一个厨师和一个服务员。菜做好之后,厨师通知服务员端菜,服务员端完菜之后厨师才能做菜。
代码如下:
public class Meal {
private final int orderNum;
public Meal(int orderNum) {
// TODO Auto-generated constructor stub
this.orderNum=orderNum;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Meal "+orderNum;
}
}
===================厨师类
public class Chef implements Runnable{
private Restaurant restaurant;
private int count=0;
public Chef(Restaurant r) {
// TODO Auto-generated constructor stub
this.restaurant=r;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(!Thread.interrupted()){
synchronized(this){
while(restaurant.meal!=null){
wait();
}
if(++count==100){
System.out.println("Out of food ");
restaurant.exec.shutdownNow();
}
System.out.println("Order up!");
//++restaurant.num;
//if(restaurant.num>1){
//System.out.println("========>>>"+count);
//}
synchronized (restaurant.waitPerson) {
restaurant.meal=new Meal(count);
restaurant.waitPerson.notifyAll();
}
//TimeUnit.MILLISECONDS.sleep(100);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Chef interrupted!");
}
}
}
====================服务员类
public class WaitPerson implements Runnable{
private Restaurant restaurant;
public WaitPerson(Restaurant r) {
// TODO Auto-generated constructor stub
this.restaurant=r;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(!Thread.interrupted()){
synchronized(this){
while(restaurant.meal==null)
wait();
}
System.out.println("WaitPerson got "+restaurant.meal);
//--restaurant.num;
synchronized(restaurant.chef){
restaurant.meal=null;
restaurant.chef.notifyAll();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Wait Person interrupted.");
}
}
}
======================饭店类
public class Restaurant {
// int num=0;
Meal meal;
ExecutorService exec=Executors.newCachedThreadPool();
WaitPerson waitPerson=new WaitPerson(this);
Chef chef=new Chef(this);
public Restaurant() {
// TODO Auto-generated constructor stub
exec.execute(chef);
exec.execute(waitPerson);
}
public static void main(String[] args){
new Restaurant();
}
}
分享到:
相关推荐
记录型信号量通常用于解决生产者-消费者问题,因为它可以记录缓冲池中的空缓冲区和满缓冲区的数量,从而实现生产者和消费者的同步。 解决生产者-消费者问题的方法 为了解决生产者-消费者问题,我们可以使用记录型...
内含多个实验文档与可运行的代码 ...1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10次。
生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...
3. **示例代码**:一个简单的生产者-消费者模型可以通过创建一个固定大小的`ArrayBlockingQueue`实现。生产者线程不断地向队列中添加元素,直到队列满为止;消费者线程则不断从队列中取出元素,直到队列为空。每条...
以下是一个简单的生产者-消费者问题的解决方案概述: 1. 定义一个固定大小的缓冲区数组。 2. 初始化两个信号量:一个用于表示缓冲区的空位置数量(初始值等于缓冲区大小),另一个用于保护缓冲区(初始值为1)。 3....
下面通过一个简单的例子来说明如何实现生产者-消费者模式: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main(String[] args) { // ...
生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了保证系统的稳定性和正确性,...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
下面是一个简单的多生产者-多消费者示例: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class Producer implements Runnable { private final ...
- **多生产者-多消费者**:当有多个生产者和消费者时,问题变得更复杂,需要更高级的同步机制来确保公平性和效率。 - **优先级反转**:如果消费者线程的优先级高于生产者,可能会导致生产者被阻塞,影响整个系统的...
生产者-消费者模式是多线程编程中的一种经典模式,它通过共享缓冲区来协调多个线程之间的交互:一组线程(生产者)负责向缓冲区添加数据,而另一组线程(消费者)则从缓冲区读取并处理这些数据。这种模式能够有效地...
这些API函数在解决生产者-消费者问题时起到了关键作用,它们帮助管理线程的并发行为,确保生产者不会在缓冲区满时继续生产,消费者也不会在缓冲区为空时尝试消费。通过适当的同步机制,可以避免竞争条件和其他并发...
一、 课程设计目的 在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更...为了使本系统以更加简单、直观的形式把“消费者-生产者”问题表现出来,我选择了使 用可视化界面编程。
以下是一个简单的生产者-消费者模式的C++实现: ```cpp #include #include #include #include std::queue<int> buffer; std::mutex mtx; std::condition_variable cv; const int MAX_BUFFER_SIZE = 5; void ...
生产者消费者问题是多线程编程中的经典模型,用于模拟两个或多个并发执行的实体(生产者和消费者)共享有限资源的情况。在这个问题中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。当缓冲...
4. ** 示例代码**:一个简单的生产者-消费者模型可以通过以下代码示例来理解: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main...
1. **共享资源**:在生产者-消费者模型中,有一个共享的数据结构,通常是一个队列,用于存储生产者产生的产品。在Java中,可以使用 `ArrayBlockingQueue` 或 `LinkedBlockingQueue` 这样的并发容器来实现。 2. **...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
通过改变生产者和消费者线程的数量,可以观察到不同情况下的并发行为,如生产者等待消费者或消费者等待生产者的情况。 总结来说,这个程序实现了基本的生产者-消费者模型,利用线程同步机制解决了资源的竞争问题,...