本篇文章直接记录Java阻塞队列 BlockingQueue的使用方式。
BlockingQueue是一个接口,JDK提供了多种阻塞队列的实现方式。我们先看一下这个接口规定了哪些方法。
代码语言:javascript复制// BlockingQueue不接受null元素。当尝试添加、放置或提供null时,实现会抛出NullPointerException。
public interface BlockingQueue<E> extends Queue<E> {
// 如果可以在不违反容量限制的情况下立即将指定的元素插入此队列,则在成功时返回true,如果当前没有可用空间,则抛出IllegalStateException。
// 当使用容量受限的队列时,通常最好使用offer。
boolean add(E e);
// 如果可以在不违反容量限制的情况下立即将指定的元素插入此队列,则在成功时返回true,在当前没有可用空间时返回false。
// (有方法重载,可指定插入阻塞时间,超时返回false)
boolean offer(E e);
// 将指定的元素插入此队列,必要时等待空间变为可用。
void put(E e) throws InterruptedException;
// 检索并删除此队列的头,必要时等待,直到某个元素可用。
E take() throws InterruptedException;
// 检索并删除此队列的头,如果有必要,将等待指定的等待时间以使元素可用。
E poll(long timeout, TimeUnit unit)
throws InterruptedException;
// 从该队列中删除指定元素的单个实例(如果存在)(尚未测试是否删除多个元素)
boolean remove(Object o);
// 如果此队列包含指定的元素,则返回true。
// 更正式地说,当且仅当该队列包含至少一个元素e,使得o.equals(e)时,返回true。
public boolean contains(Object o);
// 部分实现尚未整理
}
这个接口的方法有:add
那么这个接口具体实现类有很多,(鼠标选中BlockingQueue上面 右键 – 转到 -实现)本次只挑选一部分介绍
LinkedBlockingQueue
先看下开发人员编写的注释
基于链接节点的可选有界阻塞队列。该队列对元素FIFO(先进先出)进行排序。队列的头是在队列中停留时间最长的元素。队列的尾部是在队列中停留时间最短的元素。新元素被插入到队列的尾部,队列检索操作在队列的头部获得元素。链接队列通常比基于阵列的队列具有更高的吞吐量,但在大多数并发应用程序中可预测的性能较差。
大意就是:链表阻塞队列:
代码语言:javascript复制 public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue(1024);
log.info("【阻塞队列】:添加的NiHao结果是{}", linkedBlockingQueue.add("NiHao"));
log.info("【阻塞队列】:添加的NiHaoMe结果是{}", linkedBlockingQueue.add("NiHaoMe"));
log.info("【阻塞队列】:当前拥有的元素个数:{}", linkedBlockingQueue.size());
log.info("【阻塞队列】:第一次获取获取的元素是:{},当前剩余:{}", linkedBlockingQueue.poll(), linkedBlockingQueue.size());
log.info("【阻塞队列】:第二次获取的元素是:{},当前剩余:{}", linkedBlockingQueue.take(), linkedBlockingQueue.size());
}
输入结果
【阻塞队列】:添加的NiHao结果是true 【阻塞队列】:添加的NiHaoMe结果是true 【阻塞队列】:当前拥有的元素个数:2 【阻塞队列】:第一次获取获取的元素是:NiHao,当前剩余:1 【阻塞队列】:第二次获取的元素是:NiHaoMe,当前剩余:0
特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com 第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤