一 阻塞队列
1.1 阻塞队列介绍
阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列:
put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。
take方法:当队列为空时,消费的线程则被阻塞,直到队列不空时,则可用。
阻塞功能使得生产者和消费者两端的能力得以平衡,当有任何一端速度过快时,阻塞队列便会把过快的速度给降下来。实现阻塞最重要的两个方法是 take 方法和 put 方法。
根据容量的大小,分为有界和无界两种。
总结:当队列满了无法添加元素,或者是队列空了无法移除元素时
1.2 阻塞的put与take方法逻辑
1.2.1 put方法
1) offer(E e):如果队列没满,返回true,如果队列已满,返回false(不阻塞)
2)offer(E e, long timeout, TimeUnit unit):可以设置阻塞时间,如果队列已满,则进行阻塞。超过阻塞时间,则返回false
3)put(E e):队列没满的时候是正常的插入,如果队列已满,则阻塞,直至队列空出位置
put 方法
- put 方法插入元素时,如果队列没有满,那就和普通的插入一样是正常的插入
- 但是如果队列已满,那么就无法继续插入,则阻塞,直到队列里有了空闲空间
- 如果后续队列有了空闲空间,比如消费者消费了一个元素,那么此时队列就会解除阻塞状态,并把需要添加的数据添加到队列中
- 抛出异常:add、remove、element
- 返回结果但不抛出异常:offer、poll、peek
- 阻塞:put、take
方法 | 抛出异常 | 返回特定值 | 阻塞 | 阻塞特定时间 |
入队 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
出队 | remove() | poll() | take() | poll(time, unit) |
获取队首元素 | element() | peek() | 不支持 | 不支持 |
1.3 常见的api
BlockingQueue 接口的实现类都被放在了 juc 包中。