基于阻塞队列实现消费者和生产者_阻塞队列实现下单-程序员宅基地

技术标签: 个人总结  阻塞队列  阻塞队列-生产者消费  

不知道为什么原来写的文章内容被清空,可能是没有上传成功吧,那我就再写一遍好了。。。
关于阻塞队列的说明和实现在另一篇文章中已经做了比较消息的介绍了,这里就不再赘述。
生产者-消费者 算得上是计算机领域中经典的问题之一了,生产者生产数据,消费者消费数据,类似于小学数学中的“一个池子进水,一个池子出水”问题。废话不多说了,直接上代码吧:
PS:本来想粘代码图片上来,但是考虑到reader对象很可能是需要解决实现问题,为了大家方便,所以还是文本形式的粘贴代码吧。。。

1.consumer类:

package BlockingQueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/** 
 * <p>创建人:刘星 创建日期:2017-2-24 上午10:53:56</p>
 * <p>功能描述:(消费者实现类)</p>
 * @version V1.0  
 */
public class Consumer extends BlockingDelayQueue implements Runnable{
    
    private BlockingQueue<String> queue;//阻塞队列
    public Consumer(ArrayBlockingQueue<String> arrayBlcokingQueue){
   //构造方法
        this.queue = arrayBlcokingQueue;
    }
    boolean running = true;//运行状态,用来标识是否需要从队列中消费
    public void run(){
        try{
            String data = null;
            while(running){
                System.out.println("【消费者线程正在消费数据。。。。。。】");
                data = queue.poll(10, TimeUnit.SECONDS);
            }
            if(null != data){
                System.out.println("【消费者线程消费数据,消费的数据为:】"+data);
                System.out.println("【消费者线程正在消费数据。。。】");
            }else{
                running = false;
            }
        }catch(InterruptedException ie){
            ie.printStackTrace();
        }finally{
            System.out.println("【退出消费者线程】");
        }
    }
    public void stop(){
        running = false;
    }
}

2.生产者实现类:

package BlockingQueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/** 
 * <p>创建人:刘星  创建日期:2017-2-24 上午11:09:35</p>
 * <p>功能描述:(手填)</p>
 * @version V1.0  
 */
public class Productor implements Runnable {
    
    boolean running = true;
    BlockingQueue<String> queue = null;
    public Productor(ArrayBlockingQueue<String> arrayBlockingQueue){
        this.queue = arrayBlockingQueue;
    }
    @Override
    public void run() {
        try{
            boolean success = false;
            while(running){
                System.out.println("【生产者线程开始工作。。。。。。。】");
                success = queue.offer("data one", 10,TimeUnit.SECONDS);
            }
            if(success){
                System.out.println("【生产者线程生产完成。。。。。。。】");
            }else{
                running = false;
            }
        }catch(InterruptedException ie){
            ie.printStackTrace();
        }finally{
            System.out.println("【生产者线程退出    。。。。。。。】");
        }
    }
    public void stop(){
        running = false;
    }
}

3.测试类实现

package BlockingQueue;
import java.util.concurrent.*;

/** 
 * <p>创建人:刘星创建日期:2017-2-24 上午9:58:46</p>
 * <p>功能描述:(测试类实现)</p>
 * @version V1.0  
 */
public class BlockingDelayQueue {
    
    public static void main(String[] args) throws InterruptedException {
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
        Productor producer1 = new Productor(queue);
        Productor producer2 = new Productor(queue);
        Productor producer3 = new Productor(queue);
        Consumer consumer = new Consumer(queue);
        // 借助Executors
        ExecutorService service = Executors.newCachedThreadPool();
        // 启动线程
        service.execute(producer1);
        service.execute(producer2);
        service.execute(producer3);
        service.execute(consumer);
        Thread.sleep(3000);
        producer1.stop();
        producer2.stop();
        producer3.stop();
        Thread.sleep(2000);
        // 退出Executor
        service.shutdown();
        consumer.stop();
        System.out.println("执行完毕,退出!!--------------------------!");
    }
}

中间的几次sleep是为了让线程多执行一段时间。
菜鸟选手,大家有什么批评意见建议神马的可以在评论区留言讨论,菜鸟接受一切指正

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Richard_vi/article/details/60763934

智能推荐

什么是API测试_api调试是什么意思?-程序员宅基地

文章浏览阅读2.8k次。随着API在软件平台提供商中日益流行,为了确保应用程序之间能够正常通信,用户需要对API进行测试。虽然API测试的格式看起来像webhttp调用,但是执行的测试类型类似于其他应用程序的测试类型。API是一个应用程序调用另一个应用程序服务的一种方式。API可以提供企业软件调用之外的功能。例如天气、运动成绩、股市行情和许多其他类型的数据,都可以通过商业API获取。API通常使用代表性的状态传输(REST)接口。这使HTTP调用能够访问通用资源标识符(通常称为URI),该标识符执行对服务的调用。要测试AP_api调试是什么意思?

Homecoming CodeForces - 1315B(思维)-程序员宅基地

文章浏览阅读312次。After a long party Petya decided to return home, but he turned out to be at the opposite end of the town from his home. There are n crossroads in the line in the town, and there is either the bus or t..._homecoming codeforces

苹果录音功能在哪?iPhone自带录音功能的正确打开方式_苹果手机录音功能在哪-程序员宅基地

文章浏览阅读2w次。苹果手机的录音功能在哪?很多小伙伴平常会需要录音,但是在苹果手机中找不到这样的功能,如果你觉得苹果手机并没有这样的功能,那可是大错特错。在苹果手机里面,我们可以借助苹果手机的自带应用——语音备忘录进行录音。操作方法:1.打开苹果手机,在桌面应用中找到语音备忘录2.在界面上点击红色的按钮开始录音3.完成录音之后点击红色的按钮停止4.新录制完成的音频会自动保存在语音备忘录以iOS 1..._苹果手机录音功能在哪

基于VR技术的输电线路巡检仿真系统_vr 电力线路-程序员宅基地

文章浏览阅读1.5k次。基于VR技术,搭建电力输电仿真系统用于培训,提供用户沉浸式学习体验、交互式操作体验,VR设备能够提供沉浸式真实感的模拟场景,使得输电线路巡检内容视觉化,跨越了空间和时间的限制,有针对性的解决传统输电运检室对新员工培训的所遇到的困难.并且借助VR设备交互性特点,给学员提供误操作带来的严重后果的虚拟体验,目前高压电力设备的操作培训是基于实物进行的,不仅有较高的危险性,还不能辨别操作者是否规范操作。在输..._vr 电力线路

获取视频旋转角度,并对视频进行旋转_displaymatrix: rotation of -90.00 degrees-程序员宅基地

文章浏览阅读1.6w次。Android平台上录制视频时,如果是横屏录制(手机逆时针旋转90度),则录制的视频时不带角度的。如果是竖屏录制(正常的拿手机的姿势),此时的录制的视频的旋转角度是90度。如果再旋转90度,此时一般音量键和关屏键朝下,此时的视频的旋转角度是180。以此类推。所以在手机上的视频一般会有4中角度的视频,播放时,要对视频资源进行旋转后在进行播放。一般而言,带角度的视频和不带角度的视频,数据帧里面的宽_displaymatrix: rotation of -90.00 degrees

networkx读取csv,无法在Python中的networkx中加载一个简单的csv-程序员宅基地

文章浏览阅读191次。I am a complete noobie in Python, and I would like to study a dataset using the networkx package. I do not understand what is wrong here:I have a csv which looks like this (extract):['152027', '-6167'..._networdx 加载 csv

随便推点

UE4学习笔记:关卡流(LevelStream)-程序员宅基地

文章浏览阅读1.4w次,点赞15次,收藏73次。通过关卡流可以在需要的时候动态加载关卡,不需要的时候卸载,降低内存使用率,构建大型场景。通过简单的示例了解关卡流的用法。1、新建一个两个关卡,在关卡里分别放一个"Level1"和"Level2"的文本,保存文件名为StreamLevel1和StreamLevel22、新建一个空关卡,并打开Levels窗口3、在Levels界面,将StreamLevel1和StreamLevel..._关卡流

【友云音】【问题排查记录-5】中间件启动异常_nc中间件一直打不开-程序员宅基地

文章浏览阅读1.1k次。问题现象NC中间件启动时一直卡在这个界面不进行加载。问题分析1、查看了ncSysconfig,发现了客户的jvm参数有一段异常。客户在部署的时候少填写了一段jar包。造成中间件启动异常。上面是正确写法,下面是异常填写。修改后启动正常。2、后续客户加上友云音的jvm参数后,发现中间件启动异常缓慢,之前启动中间件5min左右,现在启动了10min还在继续。于是查看了客..._nc中间件一直打不开

3dmax渲染卡光子、灯光缓存的处理方法-程序员宅基地

文章浏览阅读194次。有3dmax效果图渲染需求可以使用渲染100(注册填邀请码‘7788’可领券免费测试)检查灯光材质细分,全局细分,灯光缓存细分是否过高,如果参数过高,尝试调低参数渲染。可以试一下优化场景的工具,清理空物体、空代理、适当塌陷精简场景、清理场景垃圾等。、在vray全局开关勾选最大射线强度。通过隐藏或删除模型的方式逐步排查。、检查是否存在坡度渐变材质。、清理空物体等场景垃圾。

FPGA设计中,对SPI进行参数化结构设计_fpga spi spi_send-程序员宅基地

文章浏览阅读367次。今天给大侠带来FPGA设计中,对SPI进行参数化结构设计,话不多说,上货。为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸。SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有三线和四线。SPI slave有什么用呢,当外部主机(cpu)要读取FPGA内部寄存器值,那就很有用了,FPGA寄存器就相当于RAM,cpu通过SPI寻址读写数据。代码仅供参考,勿做商业用途。SPI salveSPI salve支持功能: 支持三线SPI或者.._fpga spi spi_send

kettle-如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本_kettle9.0 参数无法传递给子转换-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏16次。用途如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本1、作业总体流程1.1、作业命名参数1.2、设置变量-步骤/* 如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本功能:获取或设置变量作用域:仅当前作业(job)有效parent_job.setVariableparent_job.getVariable功能:获取或设置参数变量作用域:作业(..._kettle9.0 参数无法传递给子转换

Linxu界面之如何使侧边栏自动隐藏?(Ubuntu)_如何隐藏ubuntu侧边栏-程序员宅基地

文章浏览阅读5.5k次。如果你装了ubuntu桌面版就会发现默认情况下桌面左边会有一个侧边栏,从中我们可以启动一些软件,但是这个侧边栏一直显示在桌面左边不是很美观,还会占据桌面的的空间。我们可以使其自动隐藏起来,当我们需要时只要把鼠标放到桌面左边它就会出现。1. 系统设置-外观打开系统设置,打开外观选项2. 点击&amp;amp;amp;amp;quot;行为&amp;amp;amp;amp;quot;标签3. 打开自动&amp;amp;amp;amp;quot;隐藏启动器&a_如何隐藏ubuntu侧边栏

推荐文章

热门文章

相关标签