排队上车了,先到先得

简介: 大家好,我是指北君。今天我们来聊一聊以数组为数据结构的阻塞队列 ArrayBlockingQueue,它实现了 BlockingQueue 接口,继承了抽象类 AbstractQueue。

BlockingQueue 提供了三个元素入队的方法

80.png


三个元素出队的方法。

81.png


一起来看看,ArrayBlockingQueue 是如何实现的吧。


初识


首先看一下 ArrayBlockingQueue 的主要属性和构造函数。


属性

82.png


从以上属性可以看出:

  1. 以数组的方式存放元素。
  2. 用 putIndex 和 takeIndex 控制元素入队和出队的索引。
  3. 用重入锁控制并发、保证线程的安全。


构造函数


ArrayBlockingQueue 有三个构造函数,其中 public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c) 构造函数并不常用,暂且不提。看其中两个构造函数。

83.png


可以看出 ArrayBlockingQueue 必须再创建时传入数组的大小。


元素入队


ArrayBlockingQueue 有 add()、offer()、put()、offer(E e, long timeout, TimeUnit unit) 方法用来元素的入队。


add


84.png85.png

上面留下了一个坑,索引等于数组的长度的时候,索引就从 0 开始了。其实很简单,这个数组是不是先入先出的,0 索引的数组先入队,也是先出队的。这时候 0 索引的位置就空了,所以 putIndex 到达数组长度的时候就可以从 0 开始。这里可以看出,ArrayBlockingQueue 是绝对不可以修改数组长度的,一旦初始化后长度就不能再改变了。


put


86.png

offer


ArrayBlockingQueue 中有两个 offer() 方法,offer(E e) 和 offer(E e, long timeout, TimeUnit unit),add() 方法调用的就是 offer(E e) 方法。


87.png


以上就是所有的元素入队的方法,可以得出一些结论:

  1. add() 元素满了,就抛出异常。
  2. offer() 元素满了,返回 false。
  3. put() 元素满了,线程阻塞等待被入队。
  4. offer(E e, long timeout, TimeUnit unit) 加入超时时间,如果时间到了元素还是没有被入队,则返回 false


移除元素


ArrayBlockingQueue 提供了 poll()、take()、poll(long timeout, TimeUnit unit)、remove() 方法用于元素的出队。



poll

ArrayBlockingQueue 中有两个 poll() 方法,poll() 和 poll(long timeout, TimeUnit unit)。

image.pngimage.png


take


image.png



remove


image.pngimage.png

以上就是所有的元素出队的方法,可以得出一些结论:

  1. poll() 元素出队为空,则返回空
  2. take() 元素出队为空的时候,会阻塞线程
  3. remove() 元素出队的时候可能会移动数组
  4. poll(long timeout, TimeUnit unit) 加入超时时间,如果时间到了还是没有元素需要出队,则返回 null


总结


ArrayBlockingQueue 可以被用在生产者和消费者模型中。

  1. ArrayBlockingQueue,不能被扩容,初始化被指定容量。
  2. 利用 putIndex 和 takeIndex 循环利用数组。
  3. 利用了 ReentrantLock 和 两个 Condition 保证了线程的安全。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

相关文章
|
3月前
|
人工智能 云栖大会 云计算
2024 云栖大会,来啦!门票开抢,先到先得!
云栖大会 2024 免费门票限量领取!
398 5
2024 云栖大会,来啦!门票开抢,先到先得!
|
3月前
|
人工智能 云栖大会
|
3月前
|
人工智能 云栖大会
|
11月前
|
人工智能 图形学
UnityAI——排队过窄洞
UnityAI——排队过窄洞
UnityAI——排队过窄洞
|
11月前
|
Java
线程池听课记录
线程池听课记录
31 0
|
云栖大会
【免费】2023云栖大会门票开抢啦!数量有限,先到先得!
报名方式:点击链接即可报名!10月31日-11月2日,让我们齐聚云栖小镇!
430 0
【免费】2023云栖大会门票开抢啦!数量有限,先到先得!
|
NoSQL Java Redis
得不到你的心,就用“分布式锁”锁住你的人 码农在囧途
朋友,如果喜欢,就去表白吧,不要因为害羞,更不要因为自卑,如果现在你都还不敢表白,那么多年后,再回头来看的时候,你可能会为曾经的胆小而后悔,也可能会为错过一个人而心中久久不能释怀,所以,大胆一点,即使失败也无所谓,至少我们曾经做过,做过了就无怨无悔,在人生这条道路上,时光稍纵即逝,我们应该把握好眼前的一切,爱是一种力量,更是一种内心的慰藉,冲吧!不要因为钱不够,不要因为容貌不出中国,更不要因为身世不显赫,你只要足够勇敢,这一切都是附加品!
109 0
|
消息中间件 JavaScript 小程序
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
小白鼠排队
小白鼠排队
154 0
深夜!小胖问我什么是读写锁?插队策略?升降级?(上)
深夜!小胖问我什么是读写锁?插队策略?升降级?
深夜!小胖问我什么是读写锁?插队策略?升降级?(上)