在看线程池ThreadPoolExecutor构造方法时有个参数BlockingQueue<Runnable> workQueue一直对Queue里面的几个方法比较模糊,看了下JDK 1.8,在这里也做下记录。
Queue<E>接口中的方法
boolean add(E e);
如果可以在不违反容量限制的情况下立即将指定的元素插入该队列,
成功时返回 true,如果当前没有可用空间,则抛出一个IIIegaISlabEepeplian异常.
boolean offer(E e);
如果可以在不违反容量限制的情况下立即将指定的元素插入到此队列中。
当使用容量受限的队列时,此方法通常比add方法更可取,后者只能通过抛出异常才能插入元素。
(添加一个元素成功会返回true,若队列已满,则返回false).
E remove();
检索并删除此队列的头部。此方法与{@link #poll}的不同之处在于,如果该队列为空,它将抛出异常.
E poll();
检索并删除该队列的头部,如果该队列为空,则返回{@code null}.
E element();
检索但不删除此队列的头部。这个方法与{@link #peek peek}的不同之处在于,它只在队列为空时抛出异常.
E peek();
检索但不删除此队列的头部,如果该队列为空,则返回{@code null}。(若队列为空返回null)
BlockingQueue<E>接口 extends Queue<E>接口,并扩展了put(E e)和take()
void put(E e) throws InterruptedException;
将指定的元素插入此队列中,在必要时等待空间可用(若队列满了,则会阻塞).
E take() throws InterruptedException;
检索并删除该队列的头部,在必要时等待,直到某个元素可用。
还有三个方法在这里也做下说明
int remainingCapacity();
返回该队列理想情况下(在没有内存或资源约束的情况下)可以在不阻塞的情况下接受的附加元素的数量,
或{@code Integer。如果没有内部限制,则使用MAX_VALUE}。
public boolean contains(Object o);
如果这个队列包含指定的元素,则返回{@code true}。更正式地说,
当且仅当该队列包含至少一个元素{@code e},使{@code o.equals(e)}时,返回{@code true}。
int drainTo(Collection<? super E> c);
从这个队列中删除所有可用的元素,并将它们添加到给定的集合中。此操作可能比重复轮询此队列更有效。
当试图将元素添加到集合{@code c}时遇到的失败可能会导致在抛出关联异常时元素既不在集合中,
也不在集合中,或者同时在集合中。尝试将队列排空到自身会导致{@code IllegalArgumentException}。
此外,如果在操作进行时修改了指定的集合,则此操作的行为是未定义的。