简介
一个阻塞队列接口定义,当队列为空时,取数据等待;当队列满时,存数据等待。
BlockingQueue
定义的常用方法如下:
\ | 抛出异常 | 特定值 | 阻塞 | 超时 |
Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) |
Remove | remove() | poll() | take() | poll(time,unit) |
Examie | element() | peek() | - | - |
1)add(e):把e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则抛出异常
2)offer(e):表示如果可能的话,将e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
3)put(e):把e加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
4)poll(time,unit):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
其中:BlockingQueue 不接受null 元素。试图add、put 或offer 一个null 元素时,某些实现会抛出NullPointerException。null 被用作指示poll 操作失败的警戒值。
阻塞队列不接受null
值元素,尝试存入null
值元素会抛异常。null
值用来表示poll()
操作失败。
阻塞队列常用场景:生产者消费者
某个线程向BlockingQueue
中插入一个对象的操作happen-before
随后的其他线程获取或删除操作这个对象的操作