阻塞队列的设计:尽管Java提供封装好的阻塞队列,这里是学习阻塞队列的设计思想
技术要求:1、使用Lock和Condition来实现
2、使用2个Condition:队列不满和队列不空
技术要点:1、需要一个队列(实质是一个数组)
2、记录队列的读取位置
3、记录队列的存放位置
4、记录队列中元素的个数,以便用来判断队列空或满的状态
5、队列满时,阻塞存放;若不满了,通知可存放
、队列空时,阻塞读取;若不空了,通知可读取
class BoundedBuffer{
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newConditoin(); //From waking the thread
final Condition notEnpty = lock.newConditoin();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object obj)throws InterruptedException{
lock.lock();
try{
while(count == items.length) notFull.await();
items[putptr] = x;
if(++putptr == itmes.length) putptr = 0;
++count;
notEmpty.signal(); //notEmpty
}finally{
lock.unlock();
}
}
public Object take()throws InterruptedException{
lock.lock();
try{
while(count == 0) notEmpty.await();
Object obj = items[takeptr];
if(++takeptr == items.length) takeptr = 0;
--count;
notFull.signal(); //notFull
retrun obj;
}finally{
lock.unlock();
}
}
} |
|