文档章节

生产者消费者模式(一)

清尘V
 清尘V
发布于 2016/05/12 22:36
字数 2515
阅读 70
收藏 6

生产者消费者模式:生产者不断产生新的数据到集合中,如果集合达到指定容量就唤醒消费者线程,并且自身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

 

© 著作权归作者所有

共有 人打赏支持
上一篇: BIO和NIO效率对比
下一篇: sleep和wait的区别
清尘V
粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
生产者/消费者模式

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

pan_1308
2016/10/27
301
0
Java多线程学习(七)

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

kakayang2011
2016/03/07
42
0
并发编程(五)——生产者消费者模式

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

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

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

xiaomin0322
05/11
0
0
架构设计:生产者/消费者模式 第1页:“生产者/消费者模式”介绍

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

冰雷卡尔
2014/05/06
112
0

没有更多内容

加载失败,请刷新页面

加载更多

码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
1
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
6
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部