阻塞队列BlockingQueue不支持插入null元素,好好了解一下阻塞队列接口设计。
public interface BlockingQueue<E> extends Queue<E> {
//下面四个接口都是添加元素,容量有限制的队列最好使用offer方法
boolean add(E e);
boolean offer(E e);
//put方法会阻塞,直到插入完成
void put(E e) throws InterruptedException;
//与put相同,区别是增加了超时时间,超时返回false
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
//检索并删除此队列的头部,会阻塞。
E take() throws InterruptedException;
//与take相同,区别是增加了超时时间,超时返回null,所以阻塞队列不接受null元素
E poll(long timeout, TimeUnit unit) throws InterruptedException;
//返回此队列理想情况下(在没有内存或资源限制的情况下)可以无阻塞插入的元素数量。
//如果没有内在限制,则返回Integer.MAX_VALUE 。
//注意不能通过检查remainingCapacity容量来判断插入元素的尝试是否会成功
int remainingCapacity();
//下面是集合方法,因为队列继承了集合接口,队列也是集合
//对于集合方法,阻塞队列是不保证线程安全的
//对于队列的核心方法,阻塞队列能保证线程安全
boolean remove(Object o);
public boolean contains(Object o);
//将队列中的元素移除并插入到指定集合中,出现异常元素可能丢失
//源码注释指示:从队列中移除所有可用元素并将它们添加到给定集合中比重复轮询队列更好
int drainTo(Collection<? super E> c);
int drainTo(Collection<? super E> c, int maxElements);
}
了解阻塞队列的接口方法后,阻塞双端队列接口是类似的,只是双端队列两头都可以进出。
网友评论