当前位置:网站首页>JUC并发容器——阻塞队列
JUC并发容器——阻塞队列
2022-08-04 05:32:00 【real沛林】
生产者消费者
尽管性能不如并发队列,但阻塞队列更加适合生产消费者的场景,这是因为它支持两个附加操作,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距:
- 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
- 支持阻塞的移除方法:当队列空时,队列会阻塞获取元素的线程,直到队列非空。
BlockingQueue Interface
BlockingQueue本身是一个接口,主要定义了关于队列的各类操作方法,当发生无法继续入队或者无数据可以读出的时候,会发生如下图所示的情况。其中:
- Special Value为true,false,null
- Blocks的方法会发生阻塞,
- Throws Exception列内的方法会抛出异常,
- Times Out指超过设定时间则会按照Special Value类型的方法返回true或者false。
阻塞队列(Blocking queue)提供了可阻塞的put和take方法,它们与可定时的offer和poll是等价的。如果Queue已经满了,put方法会被阻塞直到有空间可用;如果Queue是空的,那么take方法会被阻塞,直到有元素可用。Queue的长度可以有限,也可以无限;无限的Queue永远不会充满,所以它的put方法永远不会阻塞。
家庭成员
ArrayBlockingQueue:是一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。支持公平锁和非公平锁。【注:每一个线程在获取锁的时候可能都会排队等待,如果在等待时间上,先获取锁的线程的请求一定先被满足,那么这个锁就是公平的。反之,这个锁就是不公平的。公平的获取锁,也就是当前等待时间最长的线程先获取锁】
LinkedBlockingQueue:一个由链表结构组成的有界队列,此队列的长度为Integer.MAX_VALUE。此队列按照先进先出的顺序进行排序。
PriorityBlockingQueue: 一个支持线程优先级排序的无界队列,默认自然序进行排序,也可以自定义实现compareTo()方法来指定元素排序规则,不能保证同优先级元素的顺序。
DelayQueue: 一个实现PriorityBlockingQueue实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素。只有延时期满后才能从队列中获取元素。(DelayQueue可以运用在以下应用场景:1.缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。2.定时任务调度。使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,从比如TimerQueue就是使用DelayQueue实现的。)
SynchronousQueue: 一个不存储元素的阻塞队列,每一个put操作必须等待take操作,否则不能添加元素。支持公平锁和非公平锁。SynchronousQueue的一个使用场景是在线程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程空闲了60秒后会被回收。
LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列,相当于其它队列,LinkedTransferQueue队列多了transfer和tryTransfer方法。
LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。
Handler机制与生产者消费者模式
https://www.jianshu.com/p/25a05bf42e05
边栏推荐
- tmux concept and usage
- PS像素画学习-1
- Amazon Cloud Technology Build On-Amazon Neptune's Knowledge Graph-Based Recommendation Model Building Experience
- LeetCode_Nov_5th_Week
- 基于asp.net的法律援助平台的设计与实现(附项目链接)
- MNIST Handwritten Digit Recognition - Image Analysis Method for Binary Classification
- arm交叉编译
- LeetCode_Nov_4th_Week
- C语言无符号整型运算
- 用PPAPI插件技术在Web上显示会议视频、桌面、PPT等
猜你喜欢
随机推荐
Miscellaneous [development] [VS Code] remote - SSD retry failed
The Unity of ML - agents interpret parameter Settings
ideal life
LeetCode_Nov_3rd_Week
MNIST Handwritten Digit Recognition - Lenet-5's First Commercial Grade Convolutional Neural Network
Pipe redirection
Pytest common plug-in
webrtc代码解读一:音频数据的接收解码播放过程
SFTP的用法
strlen 转义字符
IEEE802.X protocol suite
网络通信与Socket编程概述
【五一专属】阿里云ECS大测评#五一专属|向所有热爱分享的“技术劳动者”致敬#
Rules.make - suitable for viewing in edit mode
win10下mediasoup搭建过程中的一些坑记录
Fabric v1.1 环境搭建
Object. RequireNonNull method
SSO单点登陆
Cut the hit pro subtitles export of essays
LeetCode_Nov_4th_Week