`

生产消费模型实例

阅读更多

“生产者-消费者-仓储”模型,包含三种角色:

1.生产者

2.消费者

3.仓库

 

离开了仓储,生产者消费者模型就显得没有说服力了。

 

对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。

下面的三个类分别代表了生产者,消费者和仓库

package producerconsumer;

/**
 * <p>Description: Test</p>
 * <p>Copyright (c) 2010</p>
 * <p>Project:Test</p>
 *
 * @author Tomy Zhou
 * @since 1.0
 * @version producerconsumer; Producer.java
 *         2010-3-3
 **/
public class Producer extends Thread{
    Integer producedNumber;
    Ware ware;
   
    public Producer(Integer producedNumber, Ware ware){
        this.producedNumber = producedNumber;
        this.ware = ware;
    }
   
    public void run(){
        try{
            while(true){
                ware.put(producedNumber);
            }
        }catch (Exception e) {
            // TODO: handle exception
        }
       
    }

}

package producerconsumer;


/**
 * <p>Description: Test</p>
 * <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
 *
 * @author Tomy Zhou
 * @since 1.0
 * @version producerconsumer; Consumer.java
 *         2010-3-3
 **/
public class Consumer extends Thread{
    Integer consumedNumber;
    Ware ware;
   
    public Consumer(Integer consumedNumber, Ware ware){
        this.consumedNumber = consumedNumber;
        this.ware = ware;
    }
   
    public void run(){
        try{
            while(true){
                ware.take(consumedNumber);
            }
        }catch (Exception e) {
            // TODO: handle exception
        }
       
    }
}

package producerconsumer;
/**
 * <p>Description: Test</p>
 * <p>Copyright (c) 2010</p>
  * <p>Project:Test</p>
 *
 * @author Tomy Zhou
 * @since 1.0
 * @version producerconsumer; Ware.java
 *         2010-3-3
 **/
public class Ware {
    int capacity;
    int size;
   
    public Ware(int capacity){
        this.capacity = capacity;
    }
   
    public void take(int number) throws InterruptedException{
        synchronized (this) {
            while(number>size){
                System.out.println(Thread.currentThread().getName()+"========The consumer number "+number+" is greater than the size=="+size+".Wait to put.");
                this.wait();
            }
           
            size = size -number;
            System.out.println(Thread.currentThread().getName()+"========Consumer the product========"+number+";The ware has the product======"+size);
            this.notifyAll();
        }
    }
   
    public void put(int number) throws InterruptedException{
        synchronized (this) {
            while(size+number>capacity){
                System.out.println(Thread.currentThread().getName()+"========The put number "+number+" plus the current ware size=="+size +" is greater than capacity=="+capacity+".Wait to consumer.");
                this.wait();
            }
           
            size = size +number;
            System.out.println(Thread.currentThread().getName()+"========Produced the product========"+number+";The ware has the product======"+size);
            this.notifyAll();
        }
    }
   
    public synchronized int size() {
        return size;
    }

下面代码大家想想:
  synchronized (this) {
            while(size+number>capacity){
                System.out.println(Thread.currentThread().getName()+"========The put number "+number+" plus the current ware size=="+size +" is greater than capacity=="+capacity+".Wait to consumer.");
                this.wait();
            }

为什么不能改成if (size+number>capacity)?

考虑下面的情况:
capacity:50
current size:40
生产线程Thread-0 put 20+ current size 40 = 60,线程阻塞,并释放锁
生产线程Thread-1 获取监控器的锁,并put10+currnet size 40=50,size=50,唤醒所有阻塞的线程
如果是if:Thread-0往下执行:size=50+20=70,显然超过了仓库的最大库存,在这种情况下就出现问题,如果改成while,Thread 0 仍然会阻塞,不会超过仓库的最大库存。




分享到:
评论

相关推荐

    Qt入门练习项目——生产者消费者模型.zip

    - **主线程**:创建生产者和消费者对象,并将它们分别移动到不同的QThread实例中。然后,使用connect()函数连接生产者的信号到消费者的槽,以实现数据的传递。 5. **同步控制** - **信号量(QSemaphore)**:用于...

    生产者与消费者实例代码,线程学习必备

    `ProducerAndConsumer.zip`中的代码可能包含一个简单的Java实现,生产者类(Producer)和消费者类(Consumer)分别继承自Thread类,它们共享一个`BlockingQueue`实例。生产者类的run方法不断生成数据并调用`queue....

    C++ 多线程 PV模拟生产者消费者模型多个实例

    在提供的文件列表中,我们看到多个源代码文件(如producer_consumer_problem.cpp、pc.cpp、pc0.cpp等),这些都是实现生产者消费者模型的不同实例。通过分析这些代码,我们可以学习如何使用C++的多线程库(如std::...

    java生产者消费者模型

    5. **设计模式**:生产者消费者模型可以看作是一种“生产者-消费者”设计模式的实例,它属于行为设计模式,用于协调异步处理和共享资源。此外,还可以结合观察者模式,让消费者订阅生产者,当有新数据时,生产者通知...

    RocketMQ生产消费者模型实现

    四、RocketMQ消费模型实现 1. 广播消费(Broadcasting):每个消费者都会收到所有的消息,适用于所有消费者都需要处理相同消息的场景。 2. 点对点消费(Point-to-Point):每个消息只被一个消费者消费,适用于处理...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

    监听器模式(生产消费模型)

    生产消费模型是另一种编程概念,常用于多线程环境。在这个模型中,生产者负责创建数据,消费者负责消耗数据。生产者和消费者之间需要协调工作,避免生产过快导致数据堆积,或者消费过快导致无数据可消费。这通常通过...

    生产者与消费者 模拟生产者与消费者的实例

    使用的生产者和消费者模型具有如下特点: (1)本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 (2)消费者只消费指定生产者的产品。 (3)在测试用例文件中指定...

    kafka大数据 生产者消费者实例

    在这个"Kafka大数据 生产者消费者实例"中,我们将探讨如何通过Java编程语言来实现Kafka的生产者和消费者。 首先,我们要理解Kafka中的**生产者(Producer)**,它是负责发布消息到特定主题的组件。在Java中,我们...

    操作系统中生产者与消费者问题实例

    操作系统中的生产者与消费者问题是多线程编程中的一个经典模型,它主要研究的是如何有效地在共享资源之间协调生产者和消费者的行为,以避免数据竞争和死锁等问题。在这个C#编写的实例中,我们将深入探讨这个问题及其...

    Java多线程 生产者消费者模型实例详解

    Java多线程生产者消费者模型实例详解 Java多线程生产者消费者模型是指在多线程环境下,生产者线程生产任务,消费者线程消费任务,而缓冲区是生产者和消费者之间的媒介。生产者消费者模型的主要组成部分包括生产者...

    kafka demo ,两种线程消费方式

    Kafka是一个发布/订阅模型的消息队列,它包含生产者(Producer)、消费者(Consumer)和主题(Topic)。生产者负责发布消息到主题,而消费者则订阅这些主题并消费消息。消费者通过消费者组(Consumer Group)进行...

    理解生产者消费者模型及在Python编程中的运用实例

    什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产 生数据的模块,就形象地称为...

    java中生产者和消费者模型

    Java中的生产者-消费者模型是一种经典的多线程同步问题,它涉及到线程间的协作与资源管理。在这个模型中,一个线程(生产者)负责生成数据,而另一个线程(消费者)负责处理这些数据。为了实现线程间的同步,Java...

    生产者与消费者实验报告

    在主函数中,我们创建多个生产者与消费者实例,并启动它们。然后,可以通过监控缓冲区的变化来观察生产者与消费者的行为。 #### 六、实验结果与分析 在完成实验后,我们需要对结果进行详细的分析,包括但不限于: ...

    利用数组解决生产者消费者问题

    在每次生产或消费后,程序会显示当前的时间、生产者和消费者的生产消费状况,以及缓冲区的使用状况。使用`sleep(1)`函数暂停1秒,以模拟实时的生产消费过程,使得用户可以看到每一步的变化。 整个程序通过控制生产...

    一元线性回归模型实例.ppt

    一元线性回归模型实例 一元线性回归模型是一种常用的统计模型,用于研究两个连续型变量之间的关系。该模型假设自变量(独立变量)对因变量(dependent variable)的影响,并用数学方程式来描述这种关系。 在本文中...

    kafka实例 消费者生产者

    Kafka的数据模型包括生产者、消费者、主题和分区。 **生产者**是负责生成数据并发送到Kafka集群的应用程序。在Kafka中,生产者可以将消息批量发送到一个或多个主题,以提高效率。生产者通过API与Kafka集群交互,...

    C++ builder 多线程实例(生产-消费)

    在这个“C++ Builder 多线程实例(生产-消费)”中,我们将探讨如何应用多线程技术来模拟生产者和消费者的问题,这是一个经典的并发编程模型。 生产者-消费者问题是一个典型的同步问题,旨在展示如何在共享资源之间...

    vs2017+mfc动画形式演示生产者消费者(单生产者单消费者,多生产者多消费者等)

    生产者消费者模式是一种经典的多线程同步模型,用于在并发环境中协调生产者和消费者之间的数据交换。在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的UI支持和线程管理功能来实现这一模式。本...

Global site tag (gtag.js) - Google Analytics