文档章节

生产者消费者模式(一)

清尘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

 

© 著作权归作者所有

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

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

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

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

pan_1308
2016/10/27
301
0
生产者消费者模式

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

Jeffbond
2017/04/14
0
0
并发编程(五)——生产者消费者模式

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

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

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

xiaomin0322
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部