生产/消费模型,顾名思义,就是生产者制造产品,消费者购买产品,当然,这其中要有店面作为两者的中介了。在软件开发的过程中就是一个模块作为生产者产生数据,另一个模块作为消费者处理数据,这中间夹着的是缓冲区,用来存放生产者产生的数据以及消费者提取数据的地方。结构如下:
最开始看到生产/消费模型想到的是生产者产生东西给消费者,那么缓冲区有啥用呢?其实呢,存在即合理嘛,缓冲区的存在自然有其好处的,生产者和消费者不直接依赖可以降低程序的耦合,消费者代码改变不会影响到生产者,再者,生产者和消费者直接关联,生产者生产出来的东西要等到消费者的方法响应之后才能继续太浪费时间了,此外就是可以让两者分隔开来以免生产的太快太慢或者消费的太快太慢不能及时进行处理。大致明白之后还是以代码来说明吧。
//产品类
public class Thing {
private String name;
public synchronized void set(String name){
this.setName(name);
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
}
public synchronized void get(){
try{
this.getName();
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
//生产者
public class Producer extends Thread{
private Thing thing=null;
public Producer(Thing thing){
this.thing=thing;
}
public void run(){
super.run();
while(true){
for(int i=0;i<50;i++){
this.thing.set("产品");
System.out.println("生产产品"+(i+1));
}
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
//消费者
public class Customer extends Thread{
private Thing thing=null;
public Customer(Thing thing){
this.thing=thing;
}
public void run(){
super.run();
while(true){
try{
for(int i=0;i<50;i++){
this.thing.get();
System.out.println("消费了产品"+(i+1));
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
//测试
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Thing thing=new Thing();
new Producer(thing).start();
new Customer(thing).start();
}
}
运行结果:
从结果可以看出存在着重复读取和存入的问题,还要继续改进。加入wait()和notify()方法,直接修改产品类Thing,添加标志值,通过判断完成等待和唤醒的操作。
修改后的Thing类如下:
//产品类
public class Thing {
private String name;
private boolean flag=true;//设置标志
public synchronized void set(String name){
this.setName(name);
if(flag=false){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
flag=false;//改变标志值,表示可以取走
super.notify();
}
public synchronized void get(){
if(flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
this.getName();
flag=true;
super.notify();
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
运行结果:
这样改变之后可以是生产者生产一个,消费者取走一个,但是这样的话生产者等待的时间加长,不利于资源的有效利用,缓冲区的功能未实现,要使用BlockingQueue.
//产品类
public class Thing {
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
//生产者
public class Producer extends Thread{
java.util.concurrent.BlockingQueue<Thing> list;
public Producer(java.util.concurrent.BlockingQueue<Thing> list){
this.list=list;
}
public void run(){
super.run();
int count=1;
while(true){
Thing thing=new Thing();
thing.setName("东西"+count);
try{
list.add(thing);
System.out.println("生产"+thing.getName());
count++;
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
//消费者
public class Customer extends Thread{
java.util.concurrent.ArrayBlockingQueue<Thing> list;
public Customer(ArrayBlockingQueue<Thing> list) {
this.list=list;
}
public void run(){
super.run();
while(true){
Thing thing;
try{
thing=list.take();
System.out.println("消费了"+thing.getName());
}catch(Exception e){
e.printStackTrace();
}
}
}
}
运行结果:
这个程序还不够完善,还有超出队列长度,多生存者和消费者等等情况,嘻嘻,待续~~~
- 大小: 4.3 KB
- 大小: 11.6 KB
- 大小: 10.8 KB
- 大小: 11.8 KB
分享到:
相关推荐
这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品,两者之间通过一个共享的数据缓冲区进行通信。 在Java等支持多线程的编程语言中,我们可以使用`Thread`...
在实际应用中,生产者/消费者模型可以广泛应用于数据处理、网络I/O、数据库操作等各种场景,通过合理地划分工作流程,提高系统效率。通过理解和实践这一经典问题,我们可以更好地掌握多线程编程中的同步和互斥原理,...
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
**Qt入门练习项目——生产者消费者模型** 在编程领域,生产者消费者模型是一种常见的多线程同步问题的解决方案。这个模型通常用于处理数据流的异步处理,其中一个或多个线程(生产者)生成数据,而其他线程(消费者...
在计算机科学中,生产者-消费者模型是一种经典的并发编程问题,用于解决多个线程之间如何高效、安全地共享资源的问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。C++作为一门支持...
### Linux下的生产者消费者模型算法 #### 概述 在Linux环境下实现的生产者消费者模型是一种经典的多进程或线程间通信的例子。该模型通过进程模拟生产者与消费者的角色,并利用共享存储区来模拟缓冲区,进而实现了...
在生产者/消费者模型中,"生产者"负责生成数据,而"消费者"则负责处理这些数据。它们通过共享的数据结构,如队列,进行通信。队列是一种先进先出(FIFO)的数据结构,它允许生产者在队列的一端添加元素,而消费者在...
生产者/消费者模型通常应用于有固定容量缓冲区的情况。生产者线程负责创建产品并放入缓冲区,而消费者线程则从缓冲区取出产品进行消费。关键在于,当缓冲区满时,生产者必须等待消费者消费掉一些产品;同样,当缓冲...
在生产者/消费者模型中,生产者线程在检测到缓冲区已满时调用`wait()`,释放锁并进入等待状态。消费者线程在检测到缓冲区非空时调用`notify()`,唤醒等待中的生产者线程。 2. **方法await()/signal()** - `await...
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
在这个模型中,生产者负责生产资源,而消费者则负责消耗这些资源。关键在于,生产者和消费者必须以一种协调的方式工作,以免出现资源过度消费或生产过剩的情况。这就需要用到线程同步机制,如信号量(semaphore)或...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
生产者/消费者模式是软件设计模式中的一种经典模型,它主要用于多线程环境下的数据共享。在这种模式下,生产者负责生成数据并放入一个共享的数据结构,而消费者则从这个数据结构中取出并消费数据。在Java中,阻塞...
在多线程编程中,设计模式是解决特定问题的有效手段,其中之一便是生产者-消费者模型。这个模型描述了两个或多个线程之间的协作,其中一方(生产者)生成数据,另一方(消费者)消费这些数据。在Qt框架下,我们可以...
此为教材操作系统概念第七版 第6章进程同步最后项目 生产者-消费...实验目的:生产者/消费者模型为依据,在Windows环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了保证系统的稳定性和正确性,...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
在计算机科学中,生产者/消费者问题是经典的并发编程模型,用于展示如何在多个并发执行的任务之间共享资源。在这个模型中,生产者进程负责创建数据,而消费者进程则负责消费这些数据。这种问题通常通过线程或进程来...
在IT领域,生产者消费者模型是一种经典的并发编程模式,它源于操作系统理论,用于解决资源的高效利用和同步问题。在本案例中,该模型被应用于一个使用Qt框架开发的多进程环境中,使得生产者进程与消费者进程能有效地...