文档章节

生产者消费者模式(一)

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

精选30+云产品,助力企业轻松上云!>>>

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

清尘V

粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
加载中
请先登录后再评论。
多进程操作-进程队列multiprocess.Queue的使用

一、ipc机制 进程通讯 管道:pipe 基于共享的内存空间队列:pipe+锁 queue 下面拿代码来实现Queue如何使用: 案例一: 案例二: 案例三:(从这往下都是了解) 案例四: 案例五: 案例六: 二、生产者...

osc_edtw4h1l
2019/09/16
1
0
Spring Boot 之 RabbitMQ 消息队列中间件的三种模式

开门见山(文末附有消息队列的几个基本概念) 1、直接模式( Direct)模式 直白的说就是一对一,生产者对应唯一的消费者(当然同一个消费者可以开启多个服务)。 虽然使用了自带的交换器(E...

osc_65w0uouu
2019/07/19
1
0
Python3学习之路~9.4 队列、生产者消费者模型

一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用。 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很...

osc_28hs2gg6
2019/05/10
2
0
实现生产者与消费者模式

实现生产者与消费者模式 目录 生产者与消费者模式实现 生产者与消费者模式 什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之...

osc_mcgiza9x
2019/01/28
2
0
Java多线程学习(七)

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

kakayang2011
2016/03/07
47
0

没有更多内容

加载失败,请刷新页面

加载更多

题解-洛谷P4724 【模板】三维凸包

洛谷P4724 【模板】三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积。 数据范围:\(1\le n\le 2000\)。 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积的讲解。 三位向量的...

osc_srnunz15
19分钟前
5
0
关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach

关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach 这个问题出自《动手学深度学习pytorch》中RNN 第六章6.4节内容,如下图所示: 当时看到这个注释,我是一脸懵逼,(...

osc_rl6hs0bo
20分钟前
11
0
为什么 wait 方法要在 synchronized 中调用?

作者:Yujiaao https://segmentfault.com/a/1190000019962661 一个有难度的 Java 问题,wait 和 notify。 它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 no...

Java技术栈
21分钟前
7
0
【退役贴】真·蒟蒻的acm感悟&回忆

窝是一只打过铁费了很大力气仍然只能大四拿铜的辣鸡的辣鸡的辣鸡…… 窝是一只打过铁费了很大力气仍然只能大四拿铜的辣鸡的辣鸡的辣鸡…… 窝是一只打过铁费了很大力气仍然只能大四拿铜的辣鸡...

osc_sqfqhs81
21分钟前
14
0
查询反模式 - GroupBy、HAVING的理解

为了最简单地说明问题,我特地设计了一张这样的表。    一、GROUP BY单值规则   规则1:单值规则,跟在SELECT后面的列表,对于每个分组来说,必须返回且仅仅返回一个值。   典型的表现...

osc_n87a5jpv
21分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部