ArrayBlockingQueue源码解析
ArrayBlockingQueue是一个用数组实现的有界阻塞队列,内部按先进先出的原则对元素进行排序。
类图
ArrayBlockingQueue的类图如下所示:
ArrayBlockingQueue实现了BlockingQueue接口和继承了AbstractQueue类。
1 | public class ArrayBlockingQueue<E> extends AbstractQueue<E> |
BlockingQueue接口只是定义了一些阻塞队列的公共方法,如下:
1 | public interface BlockingQueue<E> extends Queue<E> { |
AbstractQueue也实现了Queue接口,还提供了某些方法的默认实现
1 | // 从这可以发现,Add方法,其实就是调用的offer方法 |
主要属性
1 | /** The queued items */ |
主要方法
有参构造函数-指定大小
1 | /** |
生成一个指定大小的队列
有参构造函数-指定大小和是否公平锁
1 | /** |
生成一个指定大小的队列,并指定是否生成公平锁(true)或者是非公平锁(false)。
有参构造函数-指定大小、是否公平锁、集合
1 | /** |
size方法
1 | /** |
统计的时候锁住所有操作,然后返回大小,解锁。
put方法
将元素插入到队列中,如果队列已满,阻塞当前队列
1 | /** |
offer方法
添加一个元素到列表的末尾,如果队列空间满了,则丢弃当前元素,返回false
1 | /** |
take方法
从队列中获取一个元素,并从队列中删除该元素,如果队列为空,阻塞当前线程
1 | public E take() throws InterruptedException { |
poll方法
从队列中获取一个元素,并从队列中删除该元素,如果队列为空,直接返回null
1 | public E poll() { |
peek方法
通过takeIndex从队列中获取一个元素,如果队列为空,直接返回null
1 | public E peek() { |
remove方法
从队列中删除指定的元素,有返回true,否则返回false
1 | /** |
removeAt
如果待删除元素是头元素,设置为null,takeIndex设置为下一个。否则把后面的元素,前移
1 | /** |
contains方法
1 | /** |