BlockingQueue 提供了三个元素入队的方法
三个元素出队的方法。
一起来看看,ArrayBlockingQueue 是如何实现的吧。
初识
首先看一下 ArrayBlockingQueue 的主要属性和构造函数。
属性
从以上属性可以看出:
- 以数组的方式存放元素。
- 用 putIndex 和 takeIndex 控制元素入队和出队的索引。
- 用重入锁控制并发、保证线程的安全。
构造函数
ArrayBlockingQueue 有三个构造函数,其中 public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
构造函数并不常用,暂且不提。看其中两个构造函数。
可以看出 ArrayBlockingQueue 必须再创建时传入数组的大小。
元素入队
ArrayBlockingQueue 有 add()、offer()、put()、offer(E e, long timeout, TimeUnit unit) 方法用来元素的入队。
add
上面留下了一个坑,索引等于数组的长度的时候,索引就从 0 开始了。其实很简单,这个数组是不是先入先出的,0 索引的数组先入队,也是先出队的。这时候 0 索引的位置就空了,所以 putIndex 到达数组长度的时候就可以从 0 开始。这里可以看出,ArrayBlockingQueue 是绝对不可以修改数组长度的,一旦初始化后长度就不能再改变了。
put
offer
ArrayBlockingQueue 中有两个 offer() 方法,offer(E e) 和 offer(E e, long timeout, TimeUnit unit),add() 方法调用的就是 offer(E e) 方法。
以上就是所有的元素入队的方法,可以得出一些结论:
- add() 元素满了,就抛出异常。
- offer() 元素满了,返回 false。
- put() 元素满了,线程阻塞等待被入队。
- 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)。
take
remove
以上就是所有的元素出队的方法,可以得出一些结论:
- poll() 元素出队为空,则返回空
- take() 元素出队为空的时候,会阻塞线程
- remove() 元素出队的时候可能会移动数组
- poll(long timeout, TimeUnit unit) 加入超时时间,如果时间到了还是没有元素需要出队,则返回 null
总结
ArrayBlockingQueue 可以被用在生产者和消费者模型中。
- ArrayBlockingQueue,不能被扩容,初始化被指定容量。
- 利用 putIndex 和 takeIndex 循环利用数组。
- 利用了 ReentrantLock 和 两个 Condition 保证了线程的安全。
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!