BlockingQueue

概述

定义

BlockingQueue是一个接口,实现了Collection,Iterable, Queue接口,代表一种在插入和移除元素时都是线程安全的队列。也就是说,多个线程可以同时对BlockingQueue进行插入和移除元素的操作,而不用担心同步的问题。
之所以称为BlockingQueue,是因为它会在阻塞线程,例如,当队列为空时,一个线程来获取元素,会阻塞到直到队列中有元素。具体是否要阻塞,取决于你调用的具体方法。

使用场景

BlockingQueue的典型应用是生产者-消费者,如图所示:


blockingqueue.png

生产者线程将对象插入BlockingQueue,直到队列可包含的最大容量,然后阻塞,直到消费者线程从队列中移除对象。消费者线程持续中队列中获取对象,当队列为空时,消费者线程阻塞直到生产者线程插入一个新的对象。
BlockingQueue可以安全地用于多个生产者和多个消费者。

方法

说明

BlockingQueue接口有4种不同的方法集合来处理队列元素的插入,移除以及检查。


image.png

-Throws Exception:如果试图的操作不能立即执行,抛出异常。
-Special Value:如果试图的操作不能立即执行,返回一个特定值,通常为true或者false。
-Block:如果试图的操作不能立即执行,无限期地阻塞当前线程,直到操作可以成功。
-TimeOut:如果试图的操作不能立即执行,线程阻塞到一个最大时间,返回一个特定值说明操作是否成功,通常为true或者false。
BlockingQueue不接受null元素,否则会引发NullPointerException。null用作哨兵值,指示轮询操作失败。

具体方法

boolean add(E e): 在队列中插入元素,如果不能立即执行,抛出异常。
boolean contains(Object o):如果队列包含某元素,返回true。
int  drainTo(Collection c):将队列中的所有元素移除,并增加到 c中。
int  drainTo(Collection c, int maxElements):将队列中的元素移除,并增加到c中,个数不超过maxElements。
boolean offer(E e):在队列中插入元素,如果不能立即执行,返回false。
boolean offer(E e, long timeout, TimeUnit unit):在队列中插入元素,如果不能立即执行,等待一定时间,返回最后结果。
E poll(long timeout ,TimeUnit unit):从队首获取并移除元素,阻塞到最大时间,成功返回元素,失败返回null。
void  put(E e):在队列中插入元素,如果不能立即执行,无限制阻塞当前线程。
int remainingCapacity():返回队列的剩余容量。
boolean remove(Object o):从队列中移除一个特定元素。如果队列中包含一个或多个该元素。
E take():从队首获取并移除元素,如果不能立即执行,无限制阻塞当前线程。

实现该接口的子类

ArrayBlockingQueue
DelayQueue
LinkedBlockingDeque
LinkedBlockingQueue
LinkedTransferQueue
PriorityBlockingQueue
SynchronousQueue

你可能感兴趣的:(BlockingQueue)