BlockingQueue,用JDK文档中的原话,是用来解决类似生产者消费者问题的。
当一个Queue为空,则所有消费者被block;当一个Queue中元素已满,则所有生产者被block。生产者生产了之后,要notify所有消费者,queue中元素已不为空。相对应的,消费者消费了元素之后,要notify所有生产者,queue元素已不满。
在Java中,BlockingQueue是一个继承了Queue的接口,其实现有:ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue以及SynchronousQueue.
ArrayBlockingQueue:
底层数据结构是一个Object数组,同时有一个takeIndex,一个putIndex来表示获取操作和放操作的指针,一个count变量来记录Queue里的元素
对于并发控制,用一个ReentrantLock作为锁,两个Condition作为提示队列满或空的信号量
put函数作为类似生产者的函数。具体的实现就是经典的生产者实现了。当队列为满的时候,信号量一直等待。当插入成功后,notify所有的正在等待的消费者。具体代码如下:
take函数作为类似消费者的函数。同理也是经典的生产者实现。
当队列为空的时候,信号量一直等待。当消费成功后,notify所有的正在等待的生产者。具体代码如下:
LinkedBlockingQueue
LinkedBlockingQueue,顾名思义,是底层用Linkedlist来实现的BlockingQueue