【工具类】BlockingQueue 的介绍和使用

邓敏 2021年09月01日 89次浏览

作用

BlockingQueue为一个阻塞队列,这里的阻塞有两个含义

  • 从队列中获取元素时,如果队列为空,获取元素的线程会等待至队列中有元素再返回。
  • 往队列添加元素时,如果队列已满,添加元素的队列会等待至队列有位置的时候再添加新的元素

特点

  1. BlockingQueue中的元素不能为空
  2. 为线程安全的,但是涉及到批量操作时就不一定是原子操作。比如addAll,removeAll这种。
  3. 可以用来实现生产者-消费者队列的,并且支持多消费者和多生产者。当然也可以用来当作普通的Collection来使用,因为他实现了java.util.Collection接口。
  4. 有界队列,并不是真正的无界队列,他的最大值为Integer.MAX_VALUE.

使用

在BlockingQueue中有多种插入删除和获取元素的方法。每种方法都会有不同的作用,下面会介绍BlockingQueue的几个核心方法

插入元素

  • boolean add(E e):如果队列中有空间,立即插入一个元素到队列中,并返回true。如果队列中没有空间了,就会抛出IllegaStateException异常。对于游街队列,更常用的是使用offer方法。
  • boolean offer(E e):如果队列中有空间,立即插入一个元素到队列中,并返回true,如果没有空间则返回false。
  • void put(E e):插入一个元素到队列中,如果该队列当前已满,则该方法会一只阻塞,直到有位置可以添加后才会继续执行。
  • boolean offer(E e,long timeout,TimeUnit unit):插入一个元素到队列中,如果队列已满则等待timeout时长,插入成功并返回true,超时则返回false.

获取元素

  • E take():获取列头部的第一个元素,并在队列中移除,如果队列中没有元素,则会一直等待直到有元素来返回。
  • E poll(long timeout,TimeUnit unit): 取得队列头部的第一个元素,并讲它从队列中移除,如果队列中没有元素会等待timeout时常。

移除元素

  • boolean remove(Object o):从队列中移除指定的元素(当队列中存在这个元素时),判断方式equals方法。如果移除的元素和队列中元素的类型不一样,就会抛出ClassCastException异常,如果队列中有多个元素,就会移除掉最先超乳到队列中的那一个。

检索一个元素

  • E remove():检索出队列中头部第一个元素,但是不会删除,如果队列为空则抛出NoSuchElemenException异常
  • E peel(): 也是用来检索队列中的第一个元素,也不会删除,如果队列为空的时候,不会抛出异常而是返回null。