多线程JUC 第2季 BlockingQueue 阻塞队列
一 阻塞队列
1.1 阻塞队列介绍
阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列:
put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。
take方法:当队列为空时,消费的线程则被阻塞,直到队列不空时,则可用。
阻塞功能使得生产者和消费者两端的能力得以平衡,当有任何一端速度过快时,阻塞队列便会把过快的速度给降下来。实现阻塞最重要的两个方法是 take 方法和 put 方法。
根据容量的大小,分为有界和无界两种。
总结:当队列满了无法添加元素,或者是队列空了无法移除元素时
1.2 阻塞的put与take方法逻辑
1.2.1 put方法
1) offer(E e):如果队列没满,返回true,如果队列已满,返回false(不阻塞)
2)offer(E e, long timeout, TimeUnit unit):可以设置阻塞时间,如果队列已满,则进行阻塞。超过阻塞时间,则返回false
3)put(E e):队列没满的时候是正常的插入,如果队列已满,则阻塞,直至队列空出位置
put 方法
- put 方法插入元素时,如果队列没有满,那就和普通的插入一样是正常的插入
- 但是如果队列已满,那么就无法继续插入,则阻塞,直到队列里有了空闲空间
- 如果后续队列有了空闲空间,比如消费者消费了一个元素,那么此时队列就会解除阻塞状态,并把需要添加的数据添加到队列中

- 抛出异常:add、remove、element
- 返回结果但不抛出异常:offer、poll、peek
- 阻塞:put、take
| 方法 | 抛出异常 | 返回特定值 | 阻塞 | 阻塞特定时间 |
| 入队 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
| 出队 | remove() | poll() | take() | poll(time, unit) |
| 获取队首元素 | element() | peek() | 不支持 | 不支持 |
1.3 常见的api
BlockingQueue 接口的实现类都被放在了 juc 包中。

相关文章:
多线程JUC 第2季 BlockingQueue 阻塞队列
一 阻塞队列 1.1 阻塞队列介绍 阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列: put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。 take方法&#x…...
【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索
博主PS:你可以把他理解为,查询猜测,膨胀查询,查询的第六感。 全文搜索支持查询扩展(尤其是其变体“盲查询扩展”)。 当搜索短语太短时,这通常很有用,这通常意味着用户依赖于全文搜索…...
【面试必看】Java并发
并发 1. 线程 1. 线程vs进程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。 系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进…...
C++的第一道门坎:类与对象(一)
1.面向过程与面向对象 1.1面向过程 我们之前学习的C语言就是一种面向过程的语言,面向过程的语言强调的是具体实现的过程,一般用函数来具体实现。我们用面向过程的思想,就可以把炒菜分为以下几个步骤: 1.2面向对象 而对于面向对象的语言而言…...
经典面试题:MySQL如何调优?
目录 前言1. SQL查询优化2. 索引优化3. 表结构设计4. 硬件与配置优化5. 日常维护6. 性能测试与基准测试 前言 MySQL如何进行调优?这是面试中容易被问到的高频问题。 1. SQL查询优化 避免使用select* :只选取需要的列,减少数据传输量。使用…...
【程序员如何送外卖】
嘿,咱程序员要在美团送外卖,那还真有一番说道呢。 先说说优势哈,咱程序员那逻辑思维可不是盖的,规划送餐路线什么的,简直小菜一碟。就像敲代码找最优解一样,能迅速算出怎么送最省时间最有效率。而且咱平时…...
【git pull 和 push详解】
git pull 和 push详解 1.背景2.命令和解释2.1 git pull简介详情 2.2 git push简介Git Push 参数及详细解释 1.背景 在分布式开发环境中,git pull和git push的使用确保了团队成员之间的代码一致性,减少了不同步导致的问题。它们简化了版本管理,…...
数据挖掘导致直接路径读(direct path read)耗尽了IO
一大早就有喊业务卡的,检查等待事件源头,均为oracle写等待 查看IO负载持续维持在100%繁忙 后台有两个并行rman备份在,停止备份io繁忙没有好转,检查最近ash报告,发现DDTEK ODBC Oracle程序模块占用最高 检查该模块&…...
用队列实现栈 用栈实现队列 设计循环队列
用队列实现栈 思路 栈的特点:后进先出 队列的特点:先进先出 使用两个队列实现栈: 我们可以使用两个队列,一个队列为:空队列,一个队列为:非空队列 当我们要出队列时: 将 size - …...
BFS解决最短路问题(详解)
目录 BFS简介 && 框架: 一.二叉树的最小深度 二:迷宫中里入口最近的出口: 三.最小基因变化: 四:单词接龙: 五:为高尔夫比赛砍树: BFS简介 && 框架: 说到BFS…...
按尺寸筛选轮廓图中的轮廓
1.按短边筛选 原始轮廓图: import cv2 import numpy as np# 读取轮廓图 contour_image cv2.imread(..\\IMGS\\pp_edge.png, cv2.IMREAD_GRAYSCALE)# 使用cv2.findContours()函数获取所有轮廓 contours, _ cv2.findContours(contour_image, cv2.RETR_EXTERNAL, cv2…...
VBA高级应用30例:实现在列表框内及列表框间实现数据拖动
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
「AIGC算法」R-tree算法
R-tree算法是一种非常实用的空间数据索引技术,它可以帮助我们在复杂的空间数据中快速找到我们想要的信息。下面我将用一些生活中的例子来帮助大家更好地理解R-tree算法。 1. 定义与原理 想象一下,你有一个巨大的图书馆,里面有成千上万本书,每本书都有它在书架上的特定位置…...
2024软考上半年嵌入式系统设计师考试回顾
一:考试准备工作 1:基本上都是提前30分钟进考场,进入考试教室的时候,会有监考老师核对身份证和准考证; 2:进入考试教室之后,会再一次核对身份信息,并且有监考老师手持扫描仪&#x…...
MIT6.828 Lab2-1 Using gdb
Using gdb gdb使用: xv6 gdb调试方法 问题1: Looking at the backtrace output, which function called syscall? 按照提示开启gdb后键入: b syscall c layout src backtrace输出结果: (gdb) backtrace #0 syscall () at k…...
mysqldump提示Using a password on the command line interface can be insecured的解决办法
mysql数据库备份一句话执行命令 mysqldump --all-databases -h127.0.0.1 -uroot -p123456 > allbackupfile.sql 提示如下提示 [rootyfvyy5b2on3knb8q opt]# mysqldump --all-databases -h127.0.0.1 > allbackupfile.sql mysqldump: Couldnt execute SELECT COLUMN_NA…...
Java毕业设计 基于springboot vue考勤管理系统
Java毕业设计 基于springboot vue考勤管理系统 SpringBoot 考勤管理系统 功能介绍 员工 登录 个人中心 修改密码 个人信息 员工请假管理 员工出差管理 薪资管理 员工签到管理 公告管理 管理员 登录 个人中心 修改密码 个人信息 员工管理 员工请假管理 员工出差管理 薪资管理…...
C数据结构:二叉树
目录 二叉树的数据结构 前序遍历 中序遍历 后序遍历 二叉树的创建 二叉树的销毁 二叉树的节点个数 二叉树叶子节点个数 二叉树第K层节点个数 二叉树的查找 层序遍历 判断二叉树是否为完全二叉树 完整代码 二叉树的数据结构 typedef char BTDataType; typedef str…...
使用Nginx作为反向代理实现MQTT内外网通信
使用Nginx作为反向代理实现MQTT内外网通信 步骤1: 安装Nginx 确保你的服务器上已安装Nginx。如果未安装,可以通过以下命令在Ubuntu上安装Nginx: sudo apt update sudo apt install nginx步骤2: 配置Nginx 编辑Nginx的配置文件,通常是/etc…...
SpringBoot 上传文件示例
示例效果: 前端代码: <html> <head><title>上传文件示例</title></head> <body> <h2>方式一:普通表单上传</h2> <form action"/admin/upload" method"post" enctyp…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
