生产者和消费者实现(Java)
来源:互联网 发布:mac英文字体打包下载 编辑:程序博客网 时间:2024/06/05 01:16
生产者和消费者是我们会经常遇到的问题,今天抽时间编写了这种场景的实现。所谓生产者就是产生某种数据的一个对象(通常是一个线程),生产者生产的数据放到一个仓库中,消费者直接从仓库中提取数据即可。所谓消费者就是从仓库中提取数据的对象,通常是另外一个线程。下面生产者生产面包,放到仓库中,供消费者使用的例子。
1. 对象说明:
Bread:生产者负责生产的面包
BreadCache:生产者生产的面包存放的仓库,也就是一个缓存地址
Producer:负责生产面包的线程,生产出的面包放到BreadCache仓库中
Consumer:负责消费面包的线程,负责从BreadCache仓库中取面包进行消费
2. 示例代码
package com.csdn.algorithm.producer.consumer;/** * 生产者和消费者示例。<BR> * Bread:生产者负责生产的面包<BR> * BreadCache:生产者生产的面包存放的仓库,也就是一个缓存地址<br> *Producer:负责生产面包的线程,生产出的面包放到BreadCache仓库中<BR> *Consumer:负责消费面包的线程,负责从BreadCache仓库中取面包进行消费<BR> * * @author Administrator * */public class ProducerConsumer {/** * 主方法 * * @param args */public static void main(String[] args) {//调用内部类,也可以单独作为一个类文件ProducerConsumer aInstance = new ProducerConsumer();BreadCache currBreadCache = aInstance.new BreadCache();Producer p = aInstance.new Producer(currBreadCache);Consumer c = aInstance.new Consumer(currBreadCache);// 线程new Thread(p).start();new Thread(c).start();}// 定义一个面包类,面包只有IDclass Bread {int m_nId;public Bread(int _id) {super();this.m_nId = _id;}public String toString() {return this.m_nId + "";}}// 定义存放生产者生产出的面包,也就是面包的缓存class BreadCache {private int m_nIndex = 0;Bread[] m_oBreadCache = new Bread[10];public BreadCache() {super();}/** *向仓库中放入一个面包,如果仓库已经满了,则等待 * * @param _newBread */public synchronized void push(Bread _newBread) {while (m_nIndex == m_oBreadCache.length) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 放面包m_oBreadCache[m_nIndex] = _newBread;m_nIndex++;// 通知所有等待取面包的线程this.notifyAll();}/** * 从仓库中取一个面包,如果没有面包,则等待 * * @return */public synchronized Bread pop() {while (m_nIndex == 0) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}m_nIndex--;this.notifyAll();return m_oBreadCache[m_nIndex];}}// 生产者线程,一个线程只生产20个面包class Producer implements Runnable {BreadCache m_oCache = null;public Producer(BreadCache _cache) {m_oCache = _cache;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {Bread aBread = new Bread(i);m_oCache.push(aBread);System.out.println("生产[ " + aBread + " ]");try {Thread.currentThread().sleep((int) (Math.random() * 200));} catch (InterruptedException e) {e.printStackTrace();}}}}// 消费线程,一个线程消费掉20个面包class Consumer implements Runnable {BreadCache m_oCache = null;public Consumer(BreadCache _cache) {m_oCache = _cache;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {Bread aBread = m_oCache.pop();System.out.println("消费[ " + aBread + " ]");try {Thread.currentThread().sleep((int) (Math.random() * 200));} catch (InterruptedException e) {e.printStackTrace();}}}}}
- 生产者和消费者实现(Java)
- Java 实现生产者和消费者
- 生产者和消费者Java实现
- 生产者和消费者(Java)
- 生产者和消费者问题(java简单实现)
- 用java实现生产者和消费者问题
- Java实现生产者和消费者问题
- 用java实现生产者和消费者问题
- 生产者和消费者问题的Java实现
- java 实现kafka消息生产者和消费者
- Java实现的生产者和消费者
- 生产者消费者java实现
- Java实现生产者消费者
- 生产者消费者JAVA实现
- 生产者消费者Java实现
- java实现生产者消费者
- java实现生产者消费者
- 生产者消费者 Java 实现
- 如何划分测试用例的优先级别
- gnome3 的Fallback模式是什么意思啊?
- struts2常用常量配置终结
- 百度面试题:从输入url到显示网页,后台发生了什么?
- Google面试题及答案
- 生产者和消费者实现(Java)
- 第十一周项目3 求阿姆斯特朗数
- 【ACM】杭电1544:Palindromes
- c#动态添加控件
- heartbeat自带的断网切换功能-ipfai
- C#判断字符串是否为数字5种方案
- Chrome中利用HTML5实现具有文件“编辑”及“下载”功能的本地应用
- visio 画 弯曲 箭头 ( 波浪线 曲线)
- min2440LCD驱动