文档章节

生产者消费者模式(一)

清尘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
青岛
程序员
私信 提问
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
2018/05/11
0
0
架构设计:生产者/消费者模式 第1页:“生产者/消费者模式”介绍

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

冰雷卡尔
2014/05/06
112
0

没有更多内容

加载失败,请刷新页面

加载更多

发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
2
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
3
0
Spring 事务初始化源码分析

相关文章 Spring 事务使用详解 Spring AOP 创建代理的源码解析 Spring AOP 注解方式源码解析 Spring AOP 功能使用详解 Spring 的 getBean 方法源码解析 Spring bean 创建过程源码解析 Spring...

TSMYK
今天
1
0
Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 看下Java层一个方法在c++层 MediaPlayer后续过程 frameworks/av/media/libmedia/MediaPlayer.cpp 找一个我们之前熟悉的setDa...

天王盖地虎626
今天
3
0
【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)

1、前言   框框博客在线报时:2018-11-07 19:31:06   当前MySQL最新版本:8.0.13 (听说比5.7快2倍)   官方之前表示:MySQL 8.0 正式版 8.0.11 已发布,MySQL 8 要比 MySQL 5.7 快 2 ...

Code辉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部