文档章节

生产者消费者模式(一)

清尘V
 清尘V
发布于 2016/05/12 22:36
字数 2515
阅读 70
收藏 6
点赞 2
评论 0

生产者消费者模式:生产者不断产生新的数据到集合中,如果集合达到指定容量就唤醒消费者线程,并且自身wait等待消费者消费完集合中的数据;消费者消费集合中的数据,如果集合数据空了,则唤醒生产者线程并且自身wait。

测试线程:

package com.vincent.pc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Vincent 创建于 2016/5/12.
 */
public class Main {
    public static void main(String[] args) throws InterruptedException {


        final Demo demo = new Demo();


        ExecutorService threadPool = Executors.newFixedThreadPool(10);

        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        demo.produce();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });


        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        demo.consume();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }
}

示例:

package com.vincent.pc;

import java.util.LinkedList;

/**
 * Vincent 创建于 2016/5/12.
 */
public class Demo {


    private LinkedList linkedList = new LinkedList();
    //集合容联最大值
    int num=5;

    /**
     * 生产指定数量的产品
     */
    public void produce() throws InterruptedException {
        synchronized (this) {
            Thread.sleep(1000);
            //测试是否需要生产
            long currentTimeMillis = System.currentTimeMillis();
            linkedList.add(currentTimeMillis);
            System.out.println("生产者生产数据:" + currentTimeMillis);
            //唤醒在此对象监视器上等待的所有线程
            //lock2.notifyAll();
            if (linkedList.size() >= num) {
                this.notifyAll();
                while (linkedList.size() >= num) {
                    this.wait();
                }
            }
        }
    }

    /**
     * 消费指定数量的产品
     */
    public void consume() throws InterruptedException {
        synchronized (this) {
            Thread.sleep(500);
            Object o = linkedList.pollLast();
            if (o == null) {
                this.notifyAll();
                while (linkedList.isEmpty()) {
                    this.wait();
                }
                o=linkedList.pollLast();
            }
            System.out.println("消费者消费数据:" + o);
        }
    }

}

输出:

生产者生产数据:1463063526042
生产者生产数据:1463063527043
生产者生产数据:1463063528043
生产者生产数据:1463063529043
生产者生产数据:1463063530044
消费者消费数据:1463063530044
消费者消费数据:1463063529043
消费者消费数据:1463063528043
消费者消费数据:1463063527043
消费者消费数据:1463063526042
生产者生产数据:1463063534045
生产者生产数据:1463063535045
生产者生产数据:1463063536045
生产者生产数据:1463063537045
生产者生产数据:1463063538046
消费者消费数据:1463063538046
消费者消费数据:1463063537045
消费者消费数据:1463063536045
消费者消费数据:1463063535045
消费者消费数据:1463063534045
生产者生产数据:1463063541548
生产者生产数据:1463063542548
生产者生产数据:1463063543548
生产者生产数据:1463063544549
生产者生产数据:1463063545549
消费者消费数据:1463063545549
消费者消费数据:1463063544549
消费者消费数据:1463063543548
消费者消费数据:1463063542548
消费者消费数据:1463063541548
生产者生产数据:1463063549051
生产者生产数据:1463063550051
生产者生产数据:1463063551051
生产者生产数据:1463063552051
生产者生产数据:1463063553052
消费者消费数据:1463063553052
消费者消费数据:1463063552051
消费者消费数据:1463063551051
消费者消费数据:1463063550051
消费者消费数据:1463063549051
生产者生产数据:1463063556553
生产者生产数据:1463063557553
生产者生产数据:1463063558553
生产者生产数据:1463063559554
生产者生产数据:1463063560554
消费者消费数据:1463063560554
消费者消费数据:1463063559554
消费者消费数据:1463063558553
消费者消费数据:1463063557553
消费者消费数据:1463063556553
生产者生产数据:1463063564055
生产者生产数据:1463063565055
生产者生产数据:1463063566056
生产者生产数据:1463063567056
生产者生产数据:1463063568056
消费者消费数据:1463063568056
消费者消费数据:1463063567056
消费者消费数据:1463063566056
消费者消费数据:1463063565055
消费者消费数据:1463063564055
生产者生产数据:1463063571558
生产者生产数据:1463063572559
生产者生产数据:1463063573559
生产者生产数据:1463063574559
生产者生产数据:1463063575559
消费者消费数据:1463063575559
消费者消费数据:1463063574559
消费者消费数据:1463063573559
消费者消费数据:1463063572559
消费者消费数据:1463063571558
生产者生产数据:1463063579060
生产者生产数据:1463063580060
生产者生产数据:1463063581063
生产者生产数据:1463063582063
生产者生产数据:1463063583063
消费者消费数据:1463063583063
消费者消费数据:1463063582063
消费者消费数据:1463063581063
消费者消费数据:1463063580060
消费者消费数据:1463063579060
生产者生产数据:1463063586565
生产者生产数据:1463063587566
生产者生产数据:1463063588566
生产者生产数据:1463063589566
生产者生产数据:1463063590566
消费者消费数据:1463063590566
消费者消费数据:1463063589566
消费者消费数据:1463063588566
消费者消费数据:1463063587566
消费者消费数据:1463063586565
生产者生产数据:1463063594068
生产者生产数据:1463063595068
生产者生产数据:1463063596069
生产者生产数据:1463063597070
生产者生产数据:1463063598070
消费者消费数据:1463063598070
消费者消费数据:1463063597070
消费者消费数据:1463063596069
消费者消费数据:1463063595068
消费者消费数据:1463063594068
生产者生产数据:1463063601571
生产者生产数据:1463063602572
生产者生产数据:1463063603572
生产者生产数据:1463063604572
生产者生产数据:1463063605573
消费者消费数据:1463063605573
消费者消费数据:1463063604572
消费者消费数据:1463063603572
消费者消费数据:1463063602572
消费者消费数据:1463063601571
生产者生产数据:1463063609074
生产者生产数据:1463063610075
生产者生产数据:1463063611075
生产者生产数据:1463063612075
生产者生产数据:1463063613075
消费者消费数据:1463063613075
消费者消费数据:1463063612075
消费者消费数据:1463063611075
消费者消费数据:1463063610075
消费者消费数据:1463063609074
生产者生产数据:1463063616576
生产者生产数据:1463063617576
生产者生产数据:1463063618577
生产者生产数据:1463063619577
生产者生产数据:1463063620577
消费者消费数据:1463063620577
消费者消费数据:1463063619577
消费者消费数据:1463063618577
消费者消费数据:1463063617576
消费者消费数据:1463063616576
生产者生产数据:1463063624079
生产者生产数据:1463063625080
生产者生产数据:1463063626080
生产者生产数据:1463063627080
生产者生产数据:1463063628080
消费者消费数据:1463063628080
消费者消费数据:1463063627080
消费者消费数据:1463063626080
消费者消费数据:1463063625080
消费者消费数据:1463063624079
生产者生产数据:1463063631581
生产者生产数据:1463063632581
生产者生产数据:1463063633582
生产者生产数据:1463063634582
生产者生产数据:1463063635582
消费者消费数据:1463063635582
消费者消费数据:1463063634582
消费者消费数据:1463063633582
消费者消费数据:1463063632581
消费者消费数据:1463063631581
生产者生产数据:1463063639084
生产者生产数据:1463063640084
生产者生产数据:1463063641084
生产者生产数据:1463063642084
生产者生产数据:1463063643084
消费者消费数据:1463063643084
消费者消费数据:1463063642084
消费者消费数据:1463063641084
消费者消费数据:1463063640084
消费者消费数据:1463063639084
生产者生产数据:1463063646585
生产者生产数据:1463063647586
生产者生产数据:1463063648586
生产者生产数据:1463063649587
生产者生产数据:1463063650587
消费者消费数据:1463063650587
消费者消费数据:1463063649587
消费者消费数据:1463063648586
消费者消费数据:1463063647586
消费者消费数据:1463063646585
生产者生产数据:1463063654089
生产者生产数据:1463063655089
生产者生产数据:1463063656089
生产者生产数据:1463063657089
生产者生产数据:1463063658089
消费者消费数据:1463063658089
消费者消费数据:1463063657089
消费者消费数据:1463063656089
消费者消费数据:1463063655089
消费者消费数据:1463063654089
生产者生产数据:1463063661591
生产者生产数据:1463063662591
生产者生产数据:1463063663591
生产者生产数据:1463063664591
生产者生产数据:1463063665591
消费者消费数据:1463063665591
消费者消费数据:1463063664591
消费者消费数据:1463063663591
消费者消费数据:1463063662591
消费者消费数据:1463063661591
生产者生产数据:1463063669093
生产者生产数据:1463063670093
生产者生产数据:1463063671094
生产者生产数据:1463063672094
生产者生产数据:1463063673095
消费者消费数据:1463063673095
消费者消费数据:1463063672094
消费者消费数据:1463063671094
消费者消费数据:1463063670093
消费者消费数据:1463063669093
生产者生产数据:1463063676596
生产者生产数据:1463063677596
生产者生产数据:1463063678596
生产者生产数据:1463063679597
生产者生产数据:1463063680597
消费者消费数据:1463063680597
消费者消费数据:1463063679597
消费者消费数据:1463063678596
消费者消费数据:1463063677596
消费者消费数据:1463063676596
生产者生产数据:1463063684098
生产者生产数据:1463063685098
生产者生产数据:1463063686098
生产者生产数据:1463063687099
生产者生产数据:1463063688100
消费者消费数据:1463063688100
消费者消费数据:1463063687099
消费者消费数据:1463063686098
消费者消费数据:1463063685098
消费者消费数据:1463063684098
生产者生产数据:1463063691602
生产者生产数据:1463063692602
生产者生产数据:1463063693602
生产者生产数据:1463063694603
生产者生产数据:1463063695603
消费者消费数据:1463063695603
消费者消费数据:1463063694603
消费者消费数据:1463063693602
消费者消费数据:1463063692602
消费者消费数据:1463063691602
生产者生产数据:1463063699105
生产者生产数据:1463063700105
生产者生产数据:1463063701105
生产者生产数据:1463063702105
生产者生产数据:1463063703106
消费者消费数据:1463063703106
消费者消费数据:1463063702105
消费者消费数据:1463063701105
消费者消费数据:1463063700105
消费者消费数据:1463063699105
生产者生产数据:1463063706606
生产者生产数据:1463063707607
生产者生产数据:1463063708607
生产者生产数据:1463063709607
生产者生产数据:1463063710607
消费者消费数据:1463063710607
消费者消费数据:1463063709607
消费者消费数据:1463063708607
消费者消费数据:1463063707607
消费者消费数据:1463063706606
生产者生产数据:1463063714109
生产者生产数据:1463063715109
生产者生产数据:1463063716109
生产者生产数据:1463063717110
生产者生产数据:1463063718110
消费者消费数据:1463063718110
消费者消费数据:1463063717110
消费者消费数据:1463063716109
消费者消费数据:1463063715109
消费者消费数据:1463063714109
生产者生产数据:1463063721612
生产者生产数据:1463063722612
生产者生产数据:1463063723612
生产者生产数据:1463063724612
生产者生产数据:1463063725613
消费者消费数据:1463063725613
消费者消费数据:1463063724612
消费者消费数据:1463063723612
消费者消费数据:1463063722612
消费者消费数据:1463063721612
生产者生产数据:1463063729114
生产者生产数据:1463063730114
生产者生产数据:1463063731115
生产者生产数据:1463063732115
生产者生产数据:1463063733115
消费者消费数据:1463063733115

 

© 著作权归作者所有

共有 人打赏支持
清尘V
粉丝 43
博文 107
码字总数 47780
作品 0
青岛
程序员
Java多线程学习(七)

等待/通知模式中最经典的案例当属生产者/消费者模式,此模式有几种变形,但都是基于wait/notify的。 生产者/消费者模式有两种类型:操作值的和操作栈的。下面分别从这两方面来讲解生产者/消费...

kakayang2011
2016/03/07
42
0
生产者/消费者模式

在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为...

pan_1308
2016/10/27
301
0
并发编程(五)——生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里...

whc20011
2016/10/31
34
0
消息队列RabbitMq的五种形式队列

MQ全称为Message Queue,消息队列是系统之间的通信方法; RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言)编写的,可复用的企业级消息系统; AMQP(高级消息队列协议)是...

xiaomin0322
05/11
0
0
生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 什么是生产者消费者模式 生产者消费者模式通过...

Jeffbond
2017/04/14
0
0
BlockingQueue学习

引言 在Concurrent包中,BlockingQueue很好的解决了在多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。同时...

jiangmitiao
2015/08/30
101
0
架构设计:生产者/消费者模式 第1页:“生产者/消费者模式”介绍

★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形...

冰雷卡尔
2014/05/06
112
0
聊聊并发(十)生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 在线程世界里,生产者就是生产数据的线程,消...

陶邦仁
2015/03/23
0
0
生产者/消费者问题的多种Java实现方式

生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两...

HenrySun
2016/05/04
89
0
RabbitMQ详解(三)------RabbitMQ的五种队列

  上一篇博客我们介绍了RabbitMQ消息通信中的一些基本概念,这篇博客我们介绍 RabbitMQ 的五种工作模式,这也是实际使用RabbitMQ需要重点关注的。   这里是RabbitMQ 官网中的相关介绍:h...

YSOcean
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Win10专业版安装GIT后使用Git Bash闪退解决办法

百度后把过程和最终解决办法记录下来: 百度首先出来的解决办法如下: 来自:https://segmentfault.com/q/1010000012722511?sort=created 重启电脑 重新安装 安装到C盘 尝试网上的教程 \Git...

特拉仔
17分钟前
0
0
设计模式

1.装饰器模式 概念 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。 实现 增加一个修饰类包裹原来的...

EasyProgramming
31分钟前
1
0
用python2和opencv进行人脸识别

一、安装cv2 sudo apt-get install python-opencv opencv-data 二、 Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 ...

wangxuwei
31分钟前
0
0
python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
今天
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
今天
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
今天
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
今天
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
1
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部