生产者—消费者问题:多线程访问的一个经典案例,即按面向对象的思想来分析问题的话,这个问题涉及四个对象,生产者Procedure、消费者Consumer、产品Product、仓库WareHouse。下面以一个简单的例子来进行实现。
一、产品Product
每个产品有一个属性id,这个id值由生产者赋予。即生产者调用产品的构造方法来设置该属性id。
class Product
{ int id=0;
Product(int id){
this.id=id;}
public String toString(){
return "Product: "+this.id;
}
}
二、仓库WareHouse
1、仓库有两个属性:库存num、容量,库存用int表示,初始化为0;容量用数组的长度表示。库存即该产品数组中的前num个产品。
2、两个方法:增加库存add和减少库存del。在add中将传入的产品参数放入库存数组,将库存量加一。减少库存del中将库存量num减一、并返回消费产品。
3、在add和del方法中,执行前后应该检查库存,若执行add方法,当库存为库存的容量时,使得当前线程wait,该线程(为生产者对象)放弃锁。直到当消费者线程执行del使得库存量小于仓库容量时,唤醒当前进程,重新获得锁,继续执行生产add。若执行del,当库存为0时,使得当前进程wait,释放锁,直到生产者进程获取锁之后执行add后库存大于0,此时唤醒进程重新获得锁,执行消费del。
4、在add和del方法中,可能出现多个生产者和多个消费者同时访问库存并执行add和del,所以这两个方法都应设置为同步方法。
class WareHouse
{ int num=0;
Product[] list=new Product[10];
public synchronized void add(Product p){
while(num==list.length-1){
try{this.wait();
}catch(Exception e){
e.printStackTrace();
}
}
this.notifyAll();
list[num]=p;
num++;
}
public synchronized Product del(){
while(num==0){
try{this.wait();
}catch(Exception e){
e.printStackTrace();
}
}
this.notifyAll();
num--;
return list[num];
}
}
三、生产者Procedure
生产者构造方法传入一个WareHouse参数生成生产者。每个Produre都是一个进程,所以实现Runnable接口和相应的run方法,在run方法中,每个Procedure可以生产10件产品。
class Procedure implements Runnable
{
WareHouse wh=null;
Procedure(WareHouse wh){
this.wh = wh;}
public void run(){
for(int i=0;i<10;i++){
Product pp =new Product(i);
wh.add(pp);
System.out.println(Thread.currentThread()+"生产了:"+pp);
}
}
}
四、消费者Consumer
消费者由传入一个WareHouse参数构造。同理,每个Consumer也实现了Runnable接口和run方法,在run方法中,设定每个消费者可以消费5件产品。
class Consumer implements Runnable
{
WareHouse wh=null;
Consumer(WareHouse wh){
this.wh = wh;}
public void run(){
for(int i=0;i<5;i++){
Product ppp= wh.del();
System.out.println(Thread.currentThread()+"消费了:"+ppp);
}
}
}
五、测试类:在main方法中首先建立一个WareHouse对象,然后利用WareHouse对象新建Procedure对象和Consumer对象各俩,最后利用Procedure和Consumer对象新建四个进程,然后start这四个进程。
public class P_C
{
public static void main(String[] args)
{
WareHouse wh =new WareHouse();
Procedure p1=new Procedure(wh);
Procedure p2=new Procedure(wh);
Consumer m1 = new Consumer(wh);
Consumer m2 =new Consumer(wh);
Thread t1 =new Thread(p1);
Thread t2 =new Thread(p2);
Thread t3 =new Thread(m1);
Thread t4 =new Thread(m2);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
分享到:
相关推荐
**Qt入门练习项目——生产者消费者模型** 在编程领域,生产者消费者模型是一种常见的多线程同步问题的解决方案。这个模型通常用于处理数据流的异步处理,其中一个或多个线程(生产者)生成数据,而其他线程(消费者...
生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
基于Linux C++的条件变量实现的生产者消费者模型,旨在进一步帮助读者理解条件变量的使用。
在这种场景下,生产者消费者模型是一个经典的多线程设计模式,它用于协调两个或多个线程之间的数据流。在给定的“wpf窗体多线程实现生产者消费者模型”中,我们将探讨如何利用C#的线程和信号量来实现这一模式,以及...
### Linux下的生产者消费者模型算法 #### 概述 在Linux环境下实现的生产者消费者模型是一种经典的多进程或线程间通信的例子。该模型通过进程模拟生产者与消费者的角色,并利用共享存储区来模拟缓冲区,进而实现了...
在IT领域,生产者消费者模型是一种经典的并发编程模式,它源于操作系统理论,用于解决资源的高效利用和同步问题。在本案例中,该模型被应用于一个使用Qt框架开发的多进程环境中,使得生产者进程与消费者进程能有效地...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
生产者,消费者,线程同步,模型,锁
### 生产者消费者模型模拟进程调度_操作系统实验报告 #### 实验目的 1. **掌握基本的同步互斥算法**:通过本次实验,学生能够理解并应用常见的同步互斥算法,如信号量(semaphore)机制,来解决多线程环境下的资源...
创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....
内容概要:操作系统实验,前端 vue3 + vite3 + pinia + ant design vue实现简易的生产者消费者模型,可以通过输入表单的形式手动调节生产者的消费速率和消费者的消费速率的形式,实现生产者消费者模型的可视化效果。...
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和...
生产者消费者模型是多线程编程中的一个经典设计模式,它在Java中有着广泛的应用。这个模型主要用于解决并发处理过程中的资源同步问题,确保生产者(数据生成者)和消费者(数据使用者)之间能有效协作,避免因数据...
### 生产者消费者模型模拟进程调度_操作系统课程设计报告 #### 一、生产者-消费者问题概述 生产者-消费者(Producer-Consumer)问题是一种典型的进程间通信问题,广泛应用于操作系统设计、计算机科学领域的教学...
在C#编程中,"生产者消费者模型"是一种常见的多线程设计模式,它通过分离数据的生产和消费过程,使得生产者线程可以专心于创建数据,而消费者线程则专注于处理这些数据,两者互不干扰,提高了系统效率。在这个模型中...
Java生产者消费者模型是多线程编程中的一个经典设计模式,它主要用来解决资源的共享问题,通过协调生产者和消费者之间的工作流程,避免资源的过度消耗或浪费。在这个模型中,生产者负责生成数据,而消费者则负责处理...