目录
【继承关系】
java.util.concurrent 包里的 BlockingQueue是一个接口, 继承Queue接口,Queue接口继承 Collection
BlockingQueue --> Queue –-> Collection
图:
队列的特点是:先进先出(FIFO—first in first out)
【常用方法】
往队列中添加元素: offer()、add()、 put()
从队列中取出或者删除元素: remove(),、peek()、element() 、 poll()、take()
每个方法的说明如下:
// 1.往队列中添加元素:
offer()方法:往队列添加元素如果队列已满直接返回false,队列未满则直接插入并返回true;
add()方法:对offer()方法的简单封装.如果队列已满,抛出异常new illegalStateException("Queue full");
put()方法:往队列里插入元素,如果队列已经满,则会一直等待直到队列中出现空位插入新元素,或者线程被中断抛出异常.
// 2.从队列中取出或者删除元素:
remove()方法:直接删除队头的元素:
peek()方法:直接取出队头的元素,并不删除.
element()方法:对peek方法进行简单封装,如果队头元素存在则取出并不删除,如果不存在抛出异常NoSuchElementException()
poll()方法:取出并删除队头的元素,当队列为空,返回null;
take()方法:取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常
offer()方法一般跟poll()方法相对应;
put()方法一般跟take()方法相对应;
日常开发过程中 offer() 与 pool() 方法用的相对比较频繁
【实现类】
队列 | 有界性 | 锁 | 数据结构 |
---|---|---|---|
ArrayBlockingQueue | bounded(有界) | 加锁 | arrayList |
LinkedBlockingQueue | optionally-bounded | 加锁 | linkedList |
PriorityBlockingQueue | unbounded | 加锁 | heap |
DelayQueue | unbounded | 加锁 | heap |
SynchronousQueue | bounded | 加锁 | 无 |
LinkedTransferQueue | unbounded | 加锁 | heap |
LinkedBlockingDeque | unbounded | 无锁 | heap |
【实现类详解】
【ArrayBlockingQueue】
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。
这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。
此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");
String string = queue.take();
【LinkedBlockingQueue】
LinkedBlockingQueue 类实现了 BlockingQueue 接口。
LinkedBlockingQueue 内部以一个链式结构(链接节点)对其元素进行存储。如果需要的话,这一链式结构可以选择一个上限。如果没有定义上限,将使用 Integer.MAX_VALUE 作为上限。
LinkedBlockingQueue 内部以 FIFO(先进先出)的顺序对元素进行存储。队列中的头元素在所有元素之中是放入时间最久的那个,而尾元素则是最短的那个。
BlockingQueue unbounded = new LinkedBlockingQueue()