1、阻塞队列分类
2、阻塞队列原理
基于ReentrantLock和Condition实现阻塞和线程间的通信。
Condition notEmpty = lock.newCondition( )
Condition notFull = lock.newCondition( )
(1)添加元素方法:add、offer、put
——add,添加元素失败会抛异常(其实是调用offer,发现返回false则抛出异常)
——offer,返回true或false
——put,只有put方法是阻塞的:当发现队列已经满了,则将当前线程添加到notFull 的等待队列(Condition队列)中挂起。
while(count == items.length){ notFull.await(); }
(2)获取(删除)元素方法:take、poll、remove
——remove,删除失败会抛异常
——poll,返回true或false
——take,只有take是阻塞的:当发现队列是空的,则将当前线程添加到notEmpty的等待队列中挂起。
while(count == 0){ notEmpty.await(); }
如何唤醒notFull和notEmpty等待队列中阻塞的线程?
* 当添加元素时,调用enqueue()——>notEmpty.signal()。新的元素添加,会唤醒notEmpty中阻塞的线程,让想要获取元素的线程可以去获取新添加的元素。
* 当获取元素时,调用dequeue()——>notFull.signal()。有元素被获取后,会唤醒notFull中阻塞的线程,让想要添加元素的线程可以继续向里面添加元素。