Java:阻塞队列BlockingQueue与应用场景

news2024/12/29 9:59:50

目录

阻塞队列

BlockingQueue的常用方法

 生产者消费者应用场景


阻塞队列

        阻塞队列BlockingQueue继承自父类Queue,该队列是线程安全的,可以安全的与多个生产者和消费者线程一起使用。

        与阻塞队列相对的,存在“非阻塞队列”的概念,那么两者在入队和出队时的区别是什么呢?答案如下图所示,

         此外,在jdk1.8的源码中,对BlockingQueue的文档注释信息与简单翻译如下,

    A {@link java.util.Queue} that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.
    阻塞队列,当获取元素时,会等待队列变为非空状态,才会返回元素值;当写入元素时,会等待队列变为非满状态时,再将其写入。

        核心思想如下:

                ①阻塞队列在变为空时,继续执行取出队列元素的操作时,会发生阻塞,直到队列中有新的元素被写入时,才停止阻塞,取出元素;

                ②阻塞队列在已满时,继续执行写入元素的操作时,会发生阻塞,直到队列中已有的元素被消费而产生空位时,才停止阻塞,写入元素。

BlockingQueue的常用方法

                BlockingQueue提供了如下的常用方法,但是请注意:并非所有的方法都会产生队列阻塞的效果。

                 其中:阻塞的方法是:put()-添加take()-取出

 生产者消费者应用场景

        阻塞队列的一个经典应用场景就是:生产者、消费者问题

        如下示例代码中,基于BlockingQueue阻塞队列与子类ArrayBlockingQueue有限阻塞队列,分别创建了2个生产者线程、1个消费者线程。2个生产者线程每隔2秒生产一个随机数,供这1个消费者进行消费。

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


//生产者
class Producer implements Runnable{
    private final BlockingQueue blockingQueue;//阻塞队列
    private final Random random = new Random();//随机数生成器

    //构造器
    public Producer(BlockingQueue queue){
        this.blockingQueue = queue;//初始化阻塞队列
    }

    //线程任务
    @Override
    public void run() {
        while (true){
            //添加产品到阻塞队列
            try {
                Thread.sleep(2000);//每隔2秒执行一次生产任务
                System.out.println("生产者产出产品");
                this.blockingQueue.put(this.produce());
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("生产时发生异常");
            }
        }
    }

    //生产方法-生产随机数
    Object produce(){
        return random.nextInt();
    }
}

//消费者
class Consumer implements Runnable{
    //阻塞队列
    private final BlockingQueue blockingQueue;

    //构造器
    public Consumer(BlockingQueue queue){
        this.blockingQueue = queue;
    }

    //执行线程任务
    @Override
    public void run() {
        while (true){
            try {
                this.consume(this.blockingQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("消费时发生异常");
            }
        }
    }

    //消费方法
    public void consume(Object production){
        System.out.println("正在消费产品:"+production);
    }

}


public class BlockingQueue_Apply {
    //properties

    //methods
    public static void main(String[] args) {
        //创建阻塞队列ArrayBlockingQueue-指定容量为10
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(10);
        //创建生产者-2个生产商
        Producer producer = new Producer(blockingQueue);
        Producer producer1 = new Producer(blockingQueue);
        //创建消费者
        Consumer consumer = new Consumer(blockingQueue);

        //生产者线程
        Thread producerThread = new Thread(producer);
        Thread producerThread1 = new Thread(producer1);
        //消费者线程
        Thread consumerThread = new Thread(consumer);

        //启动线程任务
        producerThread.start();
        producerThread1.start();
        consumerThread.start();
    }
}

                 如上图所示,该案例中,会不断执行发生生产者生产、消费者消费的子线程任务,并打印信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python采集某购物软件数据信息,轻松拿捏千元外包项目

前言 嗨嗨,想必知道外包这个词的人应该不少吧 话说,接外包有多的也有少的,少的几十,多的emm上限我就不说了,嘿嘿 今天要不要来看看一个千元的外包项目? 是采集某购物软件的一些数据信息 咋说&#xff…

Excel常用图表,看看哪个还不会?

图表是指可以直接展示数据关于时间、数量等关系,对知识挖掘和信息直观生动感起关键作用的图形结果,是对数据关系进行形象“可视化”的手段。所以将数据转换为图表能使数据更为直观。 常见图表 Excel为用户提供了10几种图表,包括柱形图、折线…

【网安神器篇】——Crunch字典生成工具

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

小啊呜产品读书笔记001:《邱岳的产品手记-07》第13讲 无用却必要:产品规划【上】 第14讲 留白与节奏:产品规划【下】

小啊呜产品读书笔记001:《邱岳的产品手记-07》第13讲 无用却必要:产品规划【上】 & 第14讲 留白与节奏:产品规划【下】一、今日阅读计划二、泛读&知识摘录1、第13讲 无用却必要:产品规划【上】2、第14讲 留白与节奏&#…

Linux set 命令的使用方法

Linux set 命令的使用方法 set 语句是内置的 shell 命令,可以显示并设置 shell 和 Linux 的环境变量。在这篇文章中,我们将尝试使用 set 命令,并且进行一些简单的剖析。 预备工作 请登录您的终端,或者打开虚拟机并且连接&#x…

出海淘金TikTok,正确姿势是什么?

提起海外版抖音TikTok,相信大家并不陌生。TikTok在继美国封禁风波之后,虽然在美国市场的扩张受到了一定阻碍,但并不妨碍它的电商领域在英国市场以及东南亚市场混得风生水起。据统计,TikTok目前是Apple App Store上下载次数最多的应…

显示DataFrame中每行(或列)中,每个位置以前出现过的最小值:cummin()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 显示DataFrame中每行(或列)中 每个位置以前出现过的最小值 cummin()函数 选择题 下列说法错误的是? import pandas as pd myDF pd.DataFrame({"A":[5,2,6], "B":[9…

通用后台管理系统前端界面Ⅸ——数据表格渲染及处理+前端分页

1、找 在页面添加table表格&#xff0c;从element-ui官网查找&#xff0c;包括数据一起复制过来&#xff0c;查看显示没有问题后&#xff0c;把tableData清空为空数组。 <template><div><el-table :data"tableData" height"auto" border …

智慧燃气解决方案-最新全套文件

智慧燃气解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧燃气全套最新解决方案合集一、建设背景 近年来城市燃气取得了巨大的发展&#xff0c;我们在享受清洁能源带来方便的同时&#xff0c;也带来了新的问题&#xff1a; ● 居民用户数量的大量增…

想知道如何图片转文字?这几个方法你别错过

工作中我们经常要处理很多含有文字的图片&#xff0c;并且大多数时候我们都需要里面的文字内容&#xff0c;如果你一个一个对照着码出来的话&#xff0c;这是很费时费力的工程&#xff0c;其实我们可以想办法将图片内容转换成文字&#xff0c;然后直接复制就可以使用了。那么你…

第十章:字典树(trie)与并查集

第十章&#xff1a;字典树&#xff08;trie&#xff09;与并查集一、字典树&#xff08;trie&#xff09;引入1、什么是字典树&#xff1f;2、思路分析3、复杂度分析4、模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;模板&#xff1a;&#xff08;3&…

vscode开发高频、通用插件集合(精选15个)

vscode开发通用插件集合1.Live Serve2. Chinese3. GitLens4. Color Highlight5. Highlight Matching Tag6. any-rule7. Time Master 或 Code Time8. Vetur9. ESLint10. Vue-format11. ENV12. background13. Code Runner14. Local History15. Postcode此文仅是本人多年的一些经验…

在全链路追踪中加入对方法(Method)追踪

在全链路追踪中加入对方法(Method)追踪 全链路追踪主要是在微服务场景下&#xff0c;实现了服务和服务之间的调用链关系。 这次尝试一下在单体应用中&#xff0c;怎么在全链路追踪技术中加入对方法(Method)追踪。 单体应用是用Springboot开放的一个简单CRUD应用&#xff0c;全…

.NET 企业基本通用权限框架系统源码

源码分享&#xff01; 系统介绍&#xff1a; 1、组织机构多级树型显示&#xff0c;各级部门从属关系一目了然操作便捷 2、用户所有的权限最终分配给用户&#xff0c;如果按用户去分配权限会把系统管理员给累死&#xff0c;系统中先建立角色&#xff0c;角色中再分配权限&#x…

一种词库的比对、保存方式

一种词库的比对、保存方式 词库以树状链表存储&#xff0c;示意图如下&#xff1a; 对于词库&#xff1a;&#xff5b;A,AB,ABC,ADE&#xff5d;可以按以下方式存储 注&#xff1a;每个链表在末尾添加\0表示结束 1 数组形式存储的空间复杂度为O(N^2) 即O(N*M) -N为敏感词长…

vscode配置linux私钥远程免密登录

安装romote-ssh 将linux下的 ssh-keygen -t rsa 生成的密钥id_rsa放到windows的目录下&#xff1a; 在vscode中配置文件路径&#xff1a; 修改配置文件的权限为666&#xff1a; chmod 666 id_rsa_179

电脑录屏快捷键是什么?电脑录屏是什么键

​在日常的生活之中&#xff0c;电脑录屏是比较常用的功能。有些小伙伴知道如何使用电脑自带的录屏软件&#xff0c;可普通的操作步骤实在是有些繁琐&#xff0c;想要通过录屏快捷键&#xff0c;快速进行录屏操作。那么电脑录屏快捷键是什么&#xff1f;电脑录屏是什么键&#…

【SpringMVC】提问问题汇总

【SpringMVC】提问问题汇总&#xff08;1&#xff09;什么是Spring MVC &#xff1f;对springMVC的理解?&#xff08;2&#xff09;SpringMVC的流程&#xff1f;&#xff08;3&#xff09;Springmvc的重要组件&#xff08;3&#xff09;Springmvc的优点&#xff08;设计模式&a…

工程机械流通行业BI经营分析框架(一)四大关注方向

工程机械流通行业的商业智能BI经营分析框架大体可以从四大方向出发来进行整体规划&#xff0c;厂商目标、业务经营目标、战略目标和行业数据这四部分内容。核心还是企业的业务经营目标&#xff0c;但是和其它三类也有很大的关系&#xff0c;所以这四部分需要放在一起去看、去规…

Java多线程(二)

目录 一、线程的使用 Thread类的有关方法 线程的调度 调度策略&#xff1a; java的调度方法 线程的优先级 线程的优先等级 如何获取优先级 线程有关方法及线程优先级练习 线程的分类 二、线程的生命周期 三、线程的同步&#xff08;一&#xff09;&#xff08;线程安…