【JUC】八、阻塞队列

news2024/11/25 2:56:23

文章目录

  • 1、阻塞队列概述
  • 2、阻塞队列分类
  • 3、 阻塞队列的四组核心方法
  • 4、Demo

在这里插入图片描述

  • 队列,先进先出,类似排队
  • 栈,先进后出,用于要优先处理最近发生的事件的场景

1、阻塞队列概述

阻塞队列,一个生产消费模式,当:

  • 队列放满了,put不进去了,put的线程阻塞(挂起),等可以put了,再唤起
  • 取没了,只能等待,取的线程阻塞(挂起),等可以取了,再唤起

而亮点就在于什么时候阻塞线程,什么时候唤起线程,则由BlockingQueue一手包办。

在这里插入图片描述

2、阻塞队列分类

在这里插入图片描述

  • ArrayBlockingQueue:底层是一个定长数组,有界阻塞队列

  • LinkedBlockingQueue:底层是一个链表,有界阻塞队列,但它的默认值其实足够大了(大小默认值为Integer.MAX_VALUE)

  • DelayQueue:队列中的元素只有到了指定的延迟时间,才能获取到该元素。是无界队列,因此生产者线程永不阻塞

  • PriorityBlockingQueue:支持优先级排序的无界阻塞队列(优先级的判断通过其构造方法传入Compator对象决定)

  • SynchronousQueue:无中介,一种不存储元素的阻塞队列、单个元素的队列,一个线程写入了数据,就必须得有一个线程取,否则不能再继续添加,用于传递性的场景

  • LinkedTransferQueue:底层是一个链表,无界阻塞队列。亮点是其有预占模式,其消费者线程取元素时,若队列为空,就生成一个元素为null的节点入队,消费者线程就等待在这个节点上,后续生产者线程来了发现有个元素为null的节点,就不再入队,直接把数据填充给这个null节点,并唤醒改null节点上等待的消费者线程取走元素

  • LinkedBlockingDeque:底层是一个链表,双向阻塞队列,可以从队列的两端插入和移除元素

3、 阻塞队列的四组核心方法

  • 插入相关的有:add、offer、put
  • 移除相关的有:remove、poll、take
  • 检查相关的有:element、peek

按照队列空或者队列满时的表现,可分为以下四组:

在这里插入图片描述

以列为单位来看以上表格的含义:

  • 抛出异常列,插入、移除、检查对应三个方法:add、remove、element,这一组,是队列满或空时再调就抛出异常
  • 特殊值列,插入、移除、检查对应三个方法:offer、poll、peek,这一组,是队列满时调offer插入返回false,而不是抛异常
  • 阻塞列,插入、移除对应两个方法:put、take,这一组,是队列满时再调put就一直阻塞,直到put成功,take同理
  • 超时列,插入、移除对应两个方法:offer、poll,这一组,是队列满时,再调offer来放数据,会阻塞,但有个最大时间,超过这个时间生产者线程就自动退出
//创建阻塞队列
BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(3);
//写
for (int i = 0; i < 4; i++) {
	blockingQueue.add(i);
}

抛异常:

在这里插入图片描述

4、Demo

创建一个阻塞队列,开两个线程分别对这个队列进行写个读,采用上面阻塞列的那一组方法,演示下生产消费者模式:

public class BlockQueueDemo {

    public static void main(String[] args) throws InterruptedException {
        //创建阻塞队列
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(3);

		//生产者线程
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    blockingQueue.put(i);
                    System.out.println(Thread.currentThread().getName() + "线程写数据成功:" + i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }).start();

		//消费者线程
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    //每次取之前歇3秒,模拟生产快,消费慢的场景
                    TimeUnit.SECONDS.sleep(3);
                    Integer takeValue = blockingQueue.take();
                    System.out.println(Thread.currentThread().getName() + "线程取数据成功:" + takeValue);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

可以看到,刚开始写线程可以写3个数据到阻塞队列,然后挂起,等消费线程取走一个,则可再写一个,此时,消费慢,阻塞队列满了,生产线程再次自动挂起,进入阻塞。

在这里插入图片描述

关于阻塞队列的具体应用 ==> 线程池,下篇整理。


API文档:https://tool.oschina.net/apidocs/apidoc?api=jdk-zh

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

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

相关文章

【Ubuntu】Windows远程Ubuntu系统

步骤 开启ssh服务并开放22端口关闭防火墙ufw或iptables &#xff1b;或者将远程端口添加到入站与出站规则安装xrdp并将xrdp用户添加到ssl-cert用户组mstsc 远程&#xff0c;输入账号密码 1、开启ssh服务 1.1. 查看ssh是否已经开启 sudo ps -e | grep ssh如果最后返回是sshd…

Scrapy----Scrapy简介

文章目录 概述与应用背景架构和组件功能和特点社区生态概述与应用背景 Scrapy,一个高效、灵活、且强大的Web爬取框架,被广泛应用于数据抓取和网页内容的结构化提取。它是用Python编写的,支持多平台运行,适用于数据挖掘、在线零售信息收集、历史数据存档等多种场景。Scrapy…

Jenkins-Windows节点-参数传入中文乱码的问题

方法一 设置环境变量 变量名&#xff1a;JAVA_TOOL_OPTIONS 变量值&#xff1a;-Dfile.encodingUTF8 还是有部分中文会乱码&#xff0c;进行区域设置

短视频账号矩阵系统源码

短视频账号矩阵系统源码搭建步骤包括以下几个方面&#xff1a; 1. 确定账号类型和目标受众&#xff1a;确定要运营的短视频账号类型&#xff0c;如搞笑、美食、美妆等&#xff0c;并明确目标受众和定位。 2. 准备账号资料&#xff1a;准备相关资质和资料&#xff0c;如营业执照…

uniapp Android如何授权打开系统蓝牙Bluetooth?

uniapp Android如何授权打开系统蓝牙&#xff1f; 使用uniapp开发蓝牙项目过程中&#xff0c;涉及到检测手机系统蓝牙是否打开功能&#xff0c;这里介绍Android&#xff0c;iOS暂时没有找到优方法。朋友们如果有好的方案&#xff0c;欢迎评论分享~ 文章目录 uniapp Android如何…

【数据库原理及应用教程】第三章 SQL

文章目录 建立数据库创建数据库选择元组select多表查询 追加元组 insert嵌套子查询 元组删除命令 deleteUpdate命令 修正与撤销数据库SQL-DDL撤销与修改撤销基本表指定数据库关闭数据库 建立数据库 学生选课数据库SCT 学生表&#xff1a;Student(SNo char(8), Sname char(10)…

微服务实战系列之Sentinel

前言 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 近年来&#xff0c;微服务已赫然崛起于IT界&#xff0c;越来越多的程序员不得不向之靠拢。也正因为各行各业都愿为…

网站安全攻防战:守护数据的钢铁堡垒

在数字化时代&#xff0c;网站的安全性至关重要&#xff0c;因为它不仅关乎用户的隐私信息&#xff0c;还涉及到业务的正常运行。一旦网站受到攻击&#xff0c;可能导致数据泄露、服务中断等问题&#xff0c;因此网站安全应成为企业和个人关注的焦点。本文将探讨网站安全的重要…

如何用Postman做接口自动化测试?一文带你学会

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用…

在市场发展中寻变革,马上消费金融树行业发展“风向标”

11月11日&#xff0c;2023金融街论坛年会第三届全球金融科技大会“金融科技创新与合规安全”平行论坛在北京召开。会上&#xff0c;马上消费金融副总经理孙磊就数据对金融的赋能作用、数据安全治理等方面展开了深度讨论。 公开信息显示&#xff0c;马上消费金融是一家经中国银保…

英飞凌Tc275使用记录:Can邮箱号确认与Busoff寄存器设置方法

目录 1、消息后处理 2、消息暂存 3、Tc275 Busoff的寄存器手动处理 1、消息后处理 消息对象成功接收或发送帧后&#xff0c;可以通知CPU对消息对象执行后处理。MultiCAN模块的后处理由两个部分组成: 消息中断触发后处理。消息挂起寄存器将挂起的消息中断收集到一个公共结构中…

【漏洞复现】maccms苹果cms 命令执行漏洞

漏洞描述 感谢提供更多信息。“苹果CMS” 似乎是指 “Maccms”&#xff0c;这是一款开源的内容管理系统&#xff0c;主要用于搭建视频网站。Maccms 提供了一套完整的解决方案&#xff0c;包括用户管理、视频上传、分类管理、数据统计等功能&#xff0c;使用户能够方便地创建和…

【整顿C盘】pycharm、chrome等软件,缓存移动

C盘爆了&#xff0c;特来找一下巨大的软件缓存&#xff0c;特此记录&#xff0c;跟随的各大教程&#xff0c;和自己的体会 一、爆炸家族JetBrains 这个适用于pycharm、idea、webstorm等等&#xff0c;只要是JetBrains家的&#xff0c;2020版本以上&#xff0c;都是一样的方法 p…

【MySQL】索引和事务(B树、B+树图解原理)

一、索引 1.1 什么是索引&#xff1f; 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.2 索引的作用 &#x1f693;&#xff08;1&#…

python科研绘图:面积图

目录 1、面积图 2、堆积面积图 1、面积图 面积图是一种数据可视化图表&#xff0c;用于展示数据随时间或其他有序类别的变化趋势。它与折线图相似&#xff0c;但在展示数据变化的同时&#xff0c;面积图还强调了各个数据点之间的累积关系。这种图表通常通过在折线下方填充颜…

【读点论文】FMViT: A multiple-frequency mixing Vision Transformer-期待源码

FMViT: A multiple-frequency mixing Vision Transformer Abstract transformer模型近年来在计算机视觉任务中得到了广泛的应用。然而&#xff0c;由于自关注的时间和内存复杂度是二次的&#xff0c;并且与输入token的数量成正比&#xff0c;大多数现有的(Vision transformer,…

IDEA配置tomcat运行环境

前言 当我们使用springboot进行开发时&#xff0c;因为已经内嵌了tomcat&#xff0c;我们不用手动配置tomcat即可运行。 我们的项目在写完后&#xff0c;会在服务器上的tomcat内运行&#xff0c;所以我们测试时&#xff0c;也需要在本地配置tomcat环境。本文便介绍了如何使用…

YOLOv8环境搭建

YOLOv8环境搭建 torch环境安装requestment.txt文件中的包安装ultralytics调用 torch环境 使用的是python3.9版本 pip install torch-2.1.0cu118-cp39-cp39-linux_x86_64.whl torchvision0.16.0 torchaudio2.1.0 --index-url https://download.pytorch.org/whl/cu118安装reques…

mysql索引学习案例

简单的学习一下mysql普通索引 这是一个小的案例 一、创建表SQL CREATE TABLE group_order (id int(11) NOT NULL AUTO_INCREMENT,group_seq varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT 拼单号,group_status int(8) NOT NULL COMMENT 100 待提货, 200 已提货, 300 已…

Linux_虚拟机常用目录汇总

根目录&#xff08;cd /&#xff09;&#xff1a;/ 表示根目录&#xff0c;cd和 / 之间有个空格&#xff01; 用户目录&#xff08;cd ~&#xff09;&#xff1a;~ 表示用户目录&#xff0c;也称为家目录。cd 和 ~ 之间有个空格&#xff01; 当前路径&#xff1a;执行 pwd 指令…