当遇到一个线程要产生数据而另一个线程要处理数据时,这就是生产者消费者的关系。生产者在生产数据以后可以直接调用消费者处理数据,也可以将生产出来的数据,放到缓冲区中,等待消费者在缓冲区中取出数据然后再处理。第一种算是同步执行的,生产者将数据产生之后等待消费者将数据处理然后进行下一个数据的生产,当消费者处理数据的时间很长,那么会直接影响到生产者的效率。第二种方法算是异步的,当生产者将数据产生以后,将数据存储到一个缓冲区中,然后当消费者要处理数据时,会直接到缓冲区中去数据。当缓冲区中没有数据时,那么消费者就要等待生产者生产数据,当缓冲区中的数据存满时,那么生产者就要先等待消费者先处理一部分数据。
针对上面的描述的异步通信的场景创建两个类:Producer(生产者)和Consumer(消费者),其中生产者负责产生数据,且仅在缓冲区未满是产生数据;消费者负责处理数据,且仅在缓冲区不空是产生数据。
/** * 生产者 */ public class Producer implements Runnable{ ThreadInter ti = null; public Producer(ThreadInter ti){ this.ti = ti; } public void run(){ for(int i=0;i<10;i++){ Cola cola = new Cola(i); ti.push(cola); System.out.println("生产了:"+cola); try{ Thread.sleep(300); }catch(Exception e){ e.printStackTrace(); } } } } /**
* 消费者 */ public class Consumer implements Runnable{ ThreadInter ti = null; public Consumer(ThreadInter ti){ this.ti = ti; } public void run(){ for(int i=0;i<10;i++){ Cola cola = ti.pop(); System.out.println("消费了:"+cola); try{ Thread.sleep(600); }catch(Exception e){ e.printStackTrace(); } } } }
还有一个Cola角色类,代表生产的商品
public class Cola{ private int id; public Cola(int id){ this.id = id; } public String toString(){ return "Cola:"+id; } }
还需要创建一个处理缓冲区的类,同时处理线程是否生产和消费,线程之间的通信
public class ThreadInter{ private int index = 0; Cola[] colas = new Cola[6]; //将cola加入缓存数组中 public synchronized void push(Cola cola){ System.out.println("生产index:"+index); while(index == colas.length){ try{ this.wait(); }catch(Exception e){ e.printStackTrace(); } } this.notify(); colas[index] = cola; index++; } //将cola取出 public synchronized Cola pop(){ System.out.println("消费index:"+index); while(index==0){ try{ this.wait(); }catch(Exception e){ e.printStackTrace(); } } this.notify(); index--; return colas[index]; } }
最后测试主类
public class Main{ public static void main(String []args) { ThreadInter ti=new ThreadInter(); Producer p=new Producer(ti); Consumer c=new Consumer(ti); new Thread(p).start(); new Thread(c).start(); } }
相关推荐
在这个场景中,“pp.rar_生产消费模型”显然指的是一个用于演示这一概念的代码实现,具体是通过烤羊肉串模型来展示的。烤羊肉串模型是一个形象化的比喻,它将羊肉串看作是产品,厨师(生产者)负责制作羊肉串,食客...
生产消费模型是另一种编程概念,常用于多线程环境。在这个模型中,生产者负责创建数据,消费者负责消耗数据。生产者和消费者之间需要协调工作,避免生产过快导致数据堆积,或者消费过快导致无数据可消费。这通常通过...
在计算机科学中,生产者-消费者模型是一种经典的并发编程问题,用于解决多个线程之间如何高效、安全地共享资源的问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。C++作为一门支持...
用pthread 实现 生产消费模型 /* * File : pc.c * * Title : Demo Producer/Consumer. * * Short : A solution to the producer consumer problem using * pthreads. * * Long : * * Author : Andrae ...
QT/C++11多线程、互斥/读写锁、多生产消费模型
本话题将深入探讨"生产者-消费者模型"(Producer-Consumer Model)在Windows多线程环境中的应用,以及如何利用关键代码段(Critical Section)和互斥量(Mutex)来实现线程同步。 生产者-消费者模型是一种经典的...
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
**Qt入门练习项目——生产者消费者模型** 在编程领域,生产者消费者模型是一种常见的多线程同步问题的解决方案。这个模型通常用于处理数据流的异步处理,其中一个或多个线程(生产者)生成数据,而其他线程(消费者...
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
"多个消费者生产者模型"是一种典型的多线程同步问题的解决方案,它主要用于处理并发操作中的资源分配和协调。在这个模型中,"生产者"负责生成数据或任务,而"消费者"则负责处理这些数据或任务。接下来,我们将深入...
### 消费者生产者模型 C++ #### 一、代码概览 此代码段实现了一个典型的消费者生产者模型,利用 C++ 和 Windows API 进行线程管理和同步控制。主要功能包括: - 定义了一个最大缓冲区数量 (`MAX_BUFFER_NUM`) 为 ...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
在IT领域,生产者消费者模型是一种经典的并发编程模式,它源于操作系统理论,用于解决资源的高效利用和同步问题。在本案例中,该模型被应用于一个使用Qt框架开发的多进程环境中,使得生产者进程与消费者进程能有效地...
生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...
在多线程编程中,设计模式是解决特定问题的有效手段,其中之一便是生产者-消费者模型。这个模型描述了两个或多个线程之间的协作,其中一方(生产者)生成数据,另一方(消费者)消费这些数据。在Qt框架下,我们可以...
四、RocketMQ消费模型实现 1. 广播消费(Broadcasting):每个消费者都会收到所有的消息,适用于所有消费者都需要处理相同消息的场景。 2. 点对点消费(Point-to-Point):每个消息只被一个消费者消费,适用于处理...
在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
生产者,消费者,线程同步,模型,锁
在C#编程中,"生产者消费者模型"是一种常见的多线程设计模式,它通过分离数据的生产和消费过程,使得生产者线程可以专心于创建数据,而消费者线程则专注于处理这些数据,两者互不干扰,提高了系统效率。在这个模型中...