当队列为空时不能移除元素,当队列非空时通知线程,此时可以出队。
当队列已满时,不能插入元素,线程阻塞,当其他线程移除元素之后,通知线程可以插入了。
实现BlockQueue接口的类有:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue
ArrayBlockingQueue:底层利用数组实现的阻塞队列
从下图中可以看出,是利用Condition实现的,Condition内部维护一个等待队列。
![](https://img.haomeiwen.com/i14367091/ef929e9c49710aef.png)
入队:将元素插入阻塞队列,并通知等待的线程队列非空,可以移除元素了。
![](https://img.haomeiwen.com/i14367091/1c87ceaac297911d.png)
出队:将元素从阻塞队列中移除,并通知等待插入元素的线程队列非满,可以插入元素了。
![](https://img.haomeiwen.com/i14367091/6cddc44ff9c59b88.png)
上面的方法是将元素插入阻塞队列,可以看到是私有的,ArrayBlockingQueue对外提供的操作是put和offer:
![](https://img.haomeiwen.com/i14367091/e41310ce910fcce1.png)
这里可以看出,当队列已满时,会调用notFull.await()线程进入等待队列;等到调用完notFull.signal()才会继续执行下面的代码,也就是当队列非空时才执行插入操作。
![](https://img.haomeiwen.com/i14367091/ddad1bfa2c2c4ba7.png)
LinkedBlockingQueue:底层用链表实现
![](https://img.haomeiwen.com/i14367091/3cc5f281bfef67d5.png)
可以看到这里使用两个锁来控制插入和移除。
![](https://img.haomeiwen.com/i14367091/f69867c089c0c658.png)
![](https://img.haomeiwen.com/i14367091/34ca64e042eae82c.png)
网友评论