BlockingQueue详解
简介
BlockingQueue接口表示一个线程安全的放入和提取实例的队列.
BlockingQueue和BlockingDequeue
BlockingQueue
常用于一个线程生产对象,一个线程消费对象.
只从一端放入对象,从另外一端取出对象.
- 一个线程持续生产对象并将其插入队列,直到达到队列的容量.
- 如果阻塞队列到达临界点,则负责生产的线程在插入对象时阻塞,直到负责消费的线程从队列中取走一个线程.
- 负责消费的线程会一直从队列中取走对象,直到队列为空.
- 若队列为空,则负责消费的线程在提取对象时被阻塞,直到一个生产的线程把一个对象添加到队列.
方法
抛异常 | 返回特定值(true/false) | 阻塞 | 超时 | |
---|---|---|---|---|
插入 | add(o) |
offer(o) |
put(o) |
offer(o,timeout,timeunit) |
移出 | remove(o) |
poll(o) |
take(o) |
poll(timeout,timeunit) |
检查 | element(o) |
peek(o) |
注:
- 抛异常:若操作无法执行,则抛出异常.
- 返回特定值:若操作完成,则返回true;否则返回false.
- 阻塞:若无法执行,则阻塞该线程,直到可以执行.
- 超时:若操作无法执行,则阻塞线程.若超过指定时间若无法执行,则返回false.
- 不能插入null,否则抛出NullPointerException.
- 基于队列的数据结构查找元素效率低.
BlockingDeque
一个线程安全的存放和提取实例的双端队列.
- 不能插入元素时,阻塞试图插入元素的线程.
- 不能提取元素时,阻塞试图提取元素的线程.
- deque是"Double Ended Queue"的缩写,表示可以从任意一端插入或提取元素.
- 在线程既是生产者又是消费者的情况下使用BlockingDeque.
方法
抛异常 | 返回特定值(true/false) | 阻塞 | 超时 | |
---|---|---|---|---|
插入 | addFirst(o) /addLast(o) |
offerFirst(o) /offerLast(o) |
putFirst(o) /putLast(o) |
offerFirst(o,timeout,timeunit) /offerLast(o,timeout,timeunit)` |
移除 | removeFirst(o) /removeLast(o) |
pollFirst(o) /pollLast(o) |
takeFirst(o) /takeLast(o) |
pollFirst(timeout,timeunti) /pollLast(timeout,timeunit) |
检查 | getFirst(o) /getLast(o) |
peekFirst(o) /peekLast(o) |
BlockingDeque与BlockingQueue的关系:BlockingDeque接口继承于BlockingQueue接口.
实现类
数组阻塞队列ArrayBlockingQueue
- 是一个有界阻塞队列,同一时间能够存储元素有限.
- 基于数组存储元素,设定后无法修改.
- 以FIFO顺序对元素进行存储.队列头元素为最先进入队列的元素,队列尾元素为最晚进入队列的元素.
延迟队列DelayQueue
- 对入队的元素设定一个延迟时间.
- 只有经过指定的延迟时间后才能从队列中取出该元素.
- 队列的元素必须实现
Delayed
接口,重写两个方法getDelay
和compareTo
,分别用来获取元素还剩下的延迟时间和比较不同元素用于在队列中排序.
链阻塞队列LinkedBlockingQueue
- 内部是链式结构对元素进行存储.
- 可以设置容量.若没有设置容量,则使用Integer.MAX_VALUE作为上限.
- 以FIFO的顺序对元素进行存储.
具有优先级的阻塞队列PriorityBlockingQueue
- 是一个无界的并发队列.
- 无法插入null元素.
- 存储的元素必须实现Comparale接口.
- 不保证相同优先级的元素之间的相对位置.
同步队列SynchronousQueue
- 内部只能容纳单个元素.
- 若队列已有一个元素,则向队列中插入元素的线程会被阻塞,直到另外一个线程从队列取走.
- 若队列为空,则取走元素的线程会被阻塞,直到另外一个线程向队列中插入一个元素.
链阻塞双端队列LinkedBlockingDeque
- 为双端队列.
- 队列为空时,从队列中抽取数据会被阻塞.
- 可以从队列的两端提取元素.(
takeFirst()
和takeLast()
)