BlockingQueue
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/7ea828b82218a1eed58b6c5281bd3abf.png)
- 主要有ArrayBlockingQueue(基于数组,有界队列)、LinkedBlockingQueue(无界队列)。
- 关键是在Blocking上,它会让服务线程在队列为空时,进行等待,当有新的消息进入队列后,自动将线程唤醒。
BlockingQueue的实现与使用
- ArrayBlockingQueue的内部元素都放在一个对象数组中,
final Object[] items;
- 压入元素:offer()-如果队列满了,返回false; put()-如果队列满了,它会一致等待,直到有空闲的位置。
- 弹出元素:poll()-如果队列为空直接返回null,take()-会等到队列中有可用元素。
- 使用 put() , take()
- 底层实现: 通过以下字段实现put(), take()
/** Main lock guarding all access */
final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;