Java-Queue的使用方法

定义

Queue接口与List、Set同一级别,都是继承了Collection接口。
LinkedList实现了Queue接口。我们平时使用的一些常见队列都是非阻塞队列,
比如PriorityQueue、LinkedList(LinkedList是双向链表,
它实现了Dequeue接口)
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,
而在表的后端进行插入操作。

阻塞队列与非阻塞队列

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,
直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列。

对应方法

非阻塞队列:
一般情况下建议使用offer、poll和peek三个方法,
add(E e) : 将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;
remove() :移除队首元素,若移除成功,则返回true;如果移除失败(队列为空),则会抛出异常;
offer(E e) :将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则返回false;
poll() :移除并获取队首元素,若成功,则返回队首元素;否则返回null;
peek() :获取队首元素,若成功,则返回队首元素;否则返回null
阻塞队列:
put(E e) : 用来向队尾存入元素,如果队列满,则等待;
take() : 用来从队首取元素,如果队列为空,则等待;
offer(E e,long timeout, TimeUnit unit) : 用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;
poll(long timeout, TimeUnit unit) : 用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取到,则返回null;否则返回取得的元素;

添加元素queue.offer(“a”)
添加元素queue.add()
queue.poll返回第一个元素,并删除
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
queue.element返回第一个元素
queue.peek返回第一个元素
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,
在队列为空时, element() 抛出一个异常,而 peek() 返回 null。