本篇文章直接记录Java阻塞队列 BlockingQueue的使用方式。

BlockingQueue是一个接口,JDK提供了多种阻塞队列的实现方式。我们先看一下这个接口规定了哪些方法。

// 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(先进先出)进行排序。队列的头是在队列中停留时间最长的元素。队列的尾部是在队列中停留时间最短的元素。新元素被插入到队列的尾部,队列检索操作在队列的头部获得元素。链接队列通常比基于阵列的队列具有更高的吞吐量,但在大多数并发应用程序中可预测的性能较差。

大意就是:链表阻塞队列:

    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博客搜索:标题关键字。以获取全部资料 ❤