学习记录 - 并发阻塞队列 - BlockingQueue接口

1.队列

队列,一种支持先进先出(FIFO)的线性数据结构。
最常见的场景就是,排队买票,排在前面的先买到票,先离开。
新来的人排在队列尾部。(当然这里是不允许插队的,可是现实生活中插队的人还不少,哎)

队列接口如下:

//队列元素类型以泛型E表示,使用实现类时自己指定,比如String,Persion等
public interface Queue<E> extends Collection<E>

接口基本方法包括:
/**
 * 不做验证的添加元素,成功返回true,失败抛异常。
 * @throws IllegalStateException 空间不足
 * @throws ClassCastException 类型不兼容,加入的元素不是队列元素类型或者元素的子类。(即队列中所有元素必须是同一类的)
 * @throws NullPointerException 加入的元素是null
 * @throws IllegalArgumentException if some property of this element prevents it from being added to this queue(字面意思是添加元素的某些属性阻止其加入队列)
*/
 boolean add(E e);

/**
 * 比add多一个容量验证,成功加入返回true,容量不够返回false。
*/
 boolean offer(E e);

/**
 * 从队列头部移除元素并返回
 * 此方法不做队列是否为空检查,队列为空会抛NoSuchElementException异常
*/
 E remove();

/**
 * 从队列头部移除元素并返回
 * 此方法与remove不同的是,如果队列为空,则返回null
*/
 E poll();

/**
 * 从队列头部返回一个元素但不删除
 * 队列为空,抛NoSuchElementException异常
*/
 E element();
 
 /**
 * 从队列头部返回一个元素但不删除
 * 队列为空,返回null
*/
E peek();
 

小结:
add 对应 offer,用来添加元素,前者不做验证,空间不够就抛异常,后者空间不够返回false。
remove 对应 poll,用来删除和获取队首元素,前者不做验证,没有元素就抛异常,后者返回null。
element 对应 peek,用来获取队首元素,前者不做验证,没有元素就抛异常,后者返回null。

2.阻塞队列

特点:
- 队列为空,获取元素的线程等待队列变为非空
- 队列为满,获取元素的线程等待队列可用

阻塞队列接口

public interface BlockingQueue<E> extends Queue<E>

在Queue基础上扩展了如下方法:

/**
 * 往队列添加元素
 * 队列满的情况会阻塞,等待队列可用
 * 等待被打断会抛InterruptedException
*/
void put(E e) throws InterruptedException;

/**
 * 从队列头部删除并返回元素
 * 队列为空的情况会阻塞,等待队列中有元素
 * 等待被打断会抛InterruptedException
*/
E take() throws InterruptedException;

/**
 * 队列为空的情况会阻塞,等待队列中有元素
 * 队列为空的情况会阻塞,等待队列中有元素,等待时间有timeout指定,unit是等待的时间单位
 * 超时未获取元素,返回null
*/
E poll(long timeout, TimeUnit unit) throws InterruptedException;

/**
 * 检查队列还能插多少个元素(理想情况向下,因为检查后,可能其他线程已经操作了队列)
 * 如果是无界队列,则返回Integer.MAX_VALUE。
*/
int remainingCapacity();

/**
 * 从队列中删除指定的元素,如果有多个,只删除一个
*/
boolean remove(Object o);

/**
 * 判断队列中是否包含某个元素
*/
boolean contains(Object o);

/**
 * 元素搬家,把队列中的所有元素转移到给定的集合中(原队列中元素将被删除)
 * 返回转移的元素数量
*/
int drainTo(Collection<? super E> c);

/**
 * 元素搬家,多了一个指定最多搬多少个元素到新的集合中
*/
int drainTo(Collection<? super E> c, int maxElements);

小结:

  1. 比起普通的队列,添加元素多了阻塞的put和offer方法。offer的重载方法提供了一个阻塞时间。
  2. 比起普通的队列,获取元素多了阻塞的take和poll方法。poll的重载方法提供一个阻塞时间。

总结:

添加元素

  • add只管加,空间不够抛异常。
  • offer只有空间够才能加,不够返回false。
  • put空间够才能加,不够就等。
  • offer(重载)空间够才能加,不够等待指定时间,超时返回null。

删除元素

  • remove 只管删,没有元素抛异常
  • poll 没有元素返回null
  • take 没有元素就等
  • poll(重载)没有元素等待指定时间,超时返回null。
发布了5 篇原创文章 · 获赞 1 · 访问量 57

猜你喜欢

转载自blog.csdn.net/weixin_42579367/article/details/104207540
今日推荐