生产者消费者简单实现(转载)

生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过共享内存缓冲区进行通信。

生产者-消费者模式中的内存缓冲区的主要功能是数据在多线程间的共享。此外,通过该缓冲区,可以缓解生产者和消费者之间的性能差。

1. 馒头

这里采用了面向对象的设计思想,馒头在整个程序中自然是一个类,其Java代码如下。

class ManTou {
    int id;
    ManTou(int id) {
        this.id = id;
    }

    public String toString() {
        return "ManTou: " + id;
    }
}

2. 篮子(装馒头)

篮子是有容量的,因此篮子类需要有一个变量表示容量;篮子至少还有取和装馒头这两个功能,其Java代码如下:

class SyncStack { //篮子
    int index = 0;
    ManTou[] arrMT = new ManTou[6]; //假设这个篮子只能装6个馒头

    public synchronized void push(ManTou wt) { //装馒头
        while(index == arrMT.length) { //篮子满了
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify(); //如果取馒头的wait了,则通知他醒来
        arrMT[index] = wt;
        index ++;
    }

    public synchronized ManTou pop() { //取馒头
        while(index == 0) { //篮子空了
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify(); //如果产馒头的wait了,则通知他醒来
        index --;
        return arrMT[index];

    }
}

3. 生产者(生产馒头)

生产者需要获取篮子这个对象,而且篮子不能是自己创建的。其Java代码如下:

class Producer implements Runnable { //生产者
    SyncStack ss = null;

    Producer(SyncStack ss) {
        this.ss = ss;
    }

    public void run() {
        for(int i=0; i<20; i++) { //一共要生成20个
            ManTou wt = new ManTou(i);
            ss.push(wt);
            System.out.println("生产了:" + wt);
            try { //生成一个睡1秒,便于观察
                Thread.sleep((long) (Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

4. 消费者(吃馒头)

消费需要获取篮子这个对象,而且这个对象必须与生产者获取的篮子是同一个对象,这样才能信息共享。其Java代码如下:

class Consumer implements Runnable {
    SyncStack ss = null;

    Consumer(SyncStack ss) {
        this.ss = ss;
    }
    public void run() {
        for(int i=0; i<20; i++) { //一共要吃20个
            ManTou wt = ss.pop();
            System.out.println("消费了:" + wt);
        }
    }
}

5. 测试运行

主函数Java代码如下:

public class ProducerConsumer {
    public static void main(String[] args) {
        SyncStack ss = new SyncStack(); //定义篮子
        Producer p = new Producer(ss);  //定义生产者
        Consumer c = new Consumer(ss);  //定义消费者
        new Thread(p).start();
        new Thread(c).start();
    }
}

转载地址:http://blog.csdn.net/ghuil/article/details/41044257

时间: 2024-11-17 01:35:03

生产者消费者简单实现(转载)的相关文章

[转载] Java实现生产者消费者问题

转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. JAVA解决线

4.利用python生成器实现简单的“生产者消费者”模型

假如说,没有生成器这种对象,那么如何实现这种简单的"生产者消费者"模型呢? import time def producer(): pro_list = [] for i in range(10000): print "包子%s制作ing" %(i) time.sleep(0.5) pro_list.append("包子%s" %i) return pro_list def consumer(pro_list): for index,stuffe

Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列.最简单的例子就是我们平时的排队,先进先出. 顺序队列的存储结构 下图是一个有6个存储空间的顺序队列的动态示意图,图中front

java多线程基本概述(六)——简单生产者消费者模式

在线程里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题于是引入了生产者和消费者模式.下面实现一个简单的生产者消费者模式: 1.一个消费者一个生产者循环消费生产 package soarhu; import java.util.ArrayList; import java.util.Lis

RabbitMQ基础概念详解(一)——环境配置及模拟生产者和消费者简单消息发送

一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信.而作为中间件的 RabbitMq 无疑是目前最流行的消息队列之一. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.

最简单的生产者消费者-pthread

基础知识思考整理 http://blog.csdn.net/aganlengzi/article/details/51345294 最基本的生产者消费者模型: 一个生产者 一个消费者 一个BUFFER 一个锁 两个条件变量 /* pthread_cond_wait的大致操作流程: 解除已被调用线程锁住的锁 等待条件,睡眠阻塞 条件到来,醒来 返回前锁住解开的调用线程锁住的锁 pthread_cond_signal用于唤醒在某个条件变量上等待的线程,一般是1个 pthread_cond_broad

使用队列queue实现一个简单的生产者消费者模型

一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的超市又该作何理解呢?诚然,它本身是作为一座交易场所而诞生. 上述情形类比到实际的软件开发过程中,经常会发现:某个线程或模块的代码负责生产数据(工厂),而生产出来的数据却不得不交给另一模块(消费者)来对其进行处理,在这之间使用了队列.栈等类似超市的东西来存储数据(超市),这就抽象除了我们的生产者/消费

生产者消费者模式(转)

本文转载自博文系列架构设计:生产者/消费者模式.文中对原文格式进行了稍加整理. 概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场.由于该模式很重要,打算分几个帖子来介绍.今天这个帖子先来扫盲一把.如果你对这个模式已经比较了解,请跳过本扫盲帖,直接看下一个帖子(关于该模式的具体应用) . 看到这里,可能有同学心中犯嘀咕了:在四人帮(GOF)的23种模式里面似乎没听说过这种嘛!其实GOF那经典的23种模式主要是基于OO的(从书名<Design Patterns: E

从生产者消费者窥探线程同步(上)

欢迎转载,转载请注明出处.尊重他人的一丢丢努力,谢谢啦! 阅读本篇之后,如果你觉得说得还有点道理,那不妨先戳一下从生产者消费者窥探线程同步(下) ,两篇一起嚼才更好呢. 最近复习了下生产者消费者模式,虽然对它不太陌生,但要说认认真真地实现,还真从来没有过,这里将它总结一下,有不妥或者见识不到之处,欢迎留言指出. 为什么要使用 大概基于以下2点: (1)可以实现解耦 大多数设计模式,都会创造出一个第三者来担任解耦角色.比如末班模式的模板类,工厂模式的工厂类等.而消费者观察者模式则是使用拥塞队列来给