`

生产者-消费者问题

阅读更多

       生产者 -消费者问题,也称为有界缓冲区问题;两个进程(线程)共享一个公共的固定大小的缓冲区,一个为生产者,将信息放入缓冲区,另一个为消费者,从缓冲区去读取信息;当缓存区满的时候,生产者 还想向其中加入新的数据项的时候,让生产者睡眠,待消费者从缓冲区中取出一个或多个数据的时候,再唤醒生产者,当消费者试图从空的缓冲区中取出数据的时候,消费者就睡眠,直到生产者向其中加入一些数据的时候吧再唤醒它;为了跟踪缓冲区中的数据项数,我们需要一个变量count,如果缓冲区中最多放N个数据项,生产者首先检查count值 是否为N,当相等的时候,生产者沉睡;否则向其中加入一些数据项,并增加count值;消费者是首先检查count是否为0,当为0的时候 ,消费者沉睡,否则取走 一个数据并且count--;每个进程同时也要检测另一个进程是否应该被唤醒,若需要则将其唤醒;

用wait()/notify()来实现,代码 如下:

package study.iostudy.ProducerAndConsumer;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Created by Taoyongpan on 2017/11/26.
 */
public class CusAndPro {
    public int count = 0;//总数
    public BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);//阻塞队列,内存缓冲区
    private volatile boolean isRunning = true;//判断当前线程是否在运行当中

    public static void main(String[] args){
        CusAndPro cusAndPro = new CusAndPro();
        Consumer consumer = cusAndPro.new Consumer();
        Producer producer = cusAndPro.new Producer();
        Thread cusT = new Thread(consumer);
        Thread proT = new Thread(producer);
        proT.start();
        cusT.start();
    }

    /**
     * 生产者
     */
    public class Producer implements Runnable {
        @Override
        public void run() {
            while (isRunning){
                synchronized (queue){
                    int data = (int) (100* Math.random());
                    if (count==10){
                        try {
                            System.out.println("队列已满");
                            queue.wait();
                        }catch (Exception e){
                            e.printStackTrace();
                            queue.notify();
                        }
                    }
                    queue.add(data);
                    count++;
                    queue.notify();
                }
            }
        }
    }

    /**
     * 消费者
     */
    public class Consumer implements Runnable{
        @Override
        public void run() {
            while (isRunning){
                synchronized (queue){
                    if (count==0){
                        try {
                            System.out.println("队列已经空了;");
                            queue.wait();
                        }catch (Exception e){
                            e.printStackTrace();
                            queue.notify();
                        }
                    }
                    queue.poll();
                    count--;
                    queue.notify();
                }
            }
        }
    }
}

 

 

分享到:
评论

相关推荐

    利用记录型信号量解决生产者-消费者问题.doc

    记录型信号量通常用于解决生产者-消费者问题,因为它可以记录缓冲池中的空缓冲区和满缓冲区的数量,从而实现生产者和消费者的同步。 解决生产者-消费者问题的方法 为了解决生产者-消费者问题,我们可以使用记录型...

    用多线程同步方法解决生产者-消费者问题(操作系统课设

    生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区,导致缓冲区的数据混乱和不一致的问题。 在解决生产者-消费者问题时,需要使用同步机制来...

    用多进程同步方法解决生产者-消费者问题

    在生产者-消费者问题中,可以使用互斥量(mutex)保证缓冲区的独占访问,以及使用条件变量(condition variable)实现生产者等待消费者消费或消费者等待生产者生产。 4. **互斥量**:互斥量用于实现对共享资源的...

    生产者-消费者问题的模拟实现(课设含源代码).doc

    生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...

    linux下用多进程同步方法解决生产者-消费者问题源代码

    生产者-消费者问题是计算机科学中的一个经典同步问题,主要探讨如何在多个进程中有效地共享有限的资源,以防止数据竞争和死锁的发生。在Linux操作系统环境下,这个问题通常通过信号量(semaphore)或管道(pipe)等...

    利用记录型信号量解决生产者-消费者问题

    1.利用记录型信号量解决生产者-消费者问题.odt1.利用记录型信号量解决生产者-消费者问题.odt1.利用记录型信号量解决生产者-消费者问题.odt

    以记录型信号量实现生产者-消费者问题

    以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...

    用多线程同步方法解决生产者-消费者问题(操作系统课设)

    ### 生产者-消费者问题详解 #### 一、问题背景与意义 生产者-消费者问题,作为操作系统领域经典的同步问题之一,广泛应用于多线程环境下资源共享的场景。它描述了一个或多个人(生产者)向一个有限容量的缓冲区中...

    jchc.rar_tearshmj_生产者_生产者-消费者问题 c++ _生产者和消费者_生产者消费者

    《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...

    用多线程同步方法解决生产者-消费者问题

    生产者-消费者问题是这种并发模型的一个经典案例,它涉及到如何在多个线程间共享资源,确保数据的一致性和正确性。在这个场景中,生产者线程负责生成数据并放入一个有限的缓冲区,而消费者线程则负责从缓冲区取出...

    进程同步与互斥 生产者与消费者问题--操作系统大作业

    生产者-消费者问题是一个经典的进程同步问题,涉及到两个进程(或线程)——生产者和消费者。生产者负责生产数据项并将其放入一个共享缓冲区,而消费者则从这个缓冲区中取出数据项进行处理。为了保证正确性,需要...

    生产者-消费者问题的Win32实现

    生产者-消费者问题是多线程编程中的一个经典同步问题,源于操作系统理论,旨在演示如何在多个线程之间安全地共享有限资源。在这个问题中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了确保...

    pandc.rar_生产控制系统_生产者与消费者_生产者-消费者问题

    生产者-消费者问题的基本情景是这样的:一个系统中有两个角色,即生产者和消费者。生产者负责生成数据,而消费者则负责处理这些数据。在实际应用中,这可能意味着生产者在内存中创建数据结构(如队列),然后消费者...

    用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...

    计算机课程设计 操作系统生产者-消费者问题

    该问题的提出是为了研究 Linux 的进程机制和信号量的实现生产者消费者问题的并发控制。通过研究该问题,可以深入了解操作系统的设计思想和实现方法。 生产者-消费者问题的定义 生产者-消费者问题是一种同步问题的...

    PC.rar_pv操作_生产者消费者_生产者-消费者问题

    首先,我们来看一下“生产者-消费者问题”的基本设定:一个系统中有两个角色,生产者和消费者。生产者负责生成数据,而消费者则负责消费这些数据。系统中有一个共享缓冲区,用于存储生产者产生的数据,供消费者取用...

    用信号量解决生产者-消费者问题.zip

    在 Ubuntu 下编写程序,用信号量解决生产者-消费者问题 在 Ubuntu 下编写应用程序 pc.c,解决经典的生产者-消费者问题,完成下面的功能: 建立一个生产者进程,N 个消费者进程(N &gt; 1) 用文件建立一个共享缓冲区 生产...

    生产者-消费者问题 VC++

    生产者-消费者问题是多线程编程中的一个经典案例,它主要展示了如何在多个并发执行的线程之间协调数据共享,确保资源的有效利用和系统稳定。在这个VC++实现的示例中,我们将深入探讨这个问题,以及如何使用C++的多...

    consumer_producer.rar_操作系统_生产 消费_生产者-消费者问题_进程调度

    在操作系统领域,生产者-消费者问题是多线程和进程同步的经典模型,用于描述并发执行的生产者进程与消费者进程如何共享资源而不会产生数据竞争或死锁的现象。在这个问题中,生产者负责生成数据,而消费者则负责消费...

Global site tag (gtag.js) - Google Analytics