使用Condition实现阻塞队列【也就是大学时候操作系统那门课上学的生产中、消费者问题】
/**
* 阻塞队列【生成者、消费者模型】
*
*/
class BlockingQueue{
private Object[] queue=new Object[100];
private int getIndex=0,putIndex=0,count=0;
final Lock lock=new ReentrantLock();
final Condition putConditon=lock.newCondition(),
getConditon=lock.newCondition();
public Object getData(){
Object obj=null;
lock.lock();
try{
try{
while(count==0){
getConditon.await();
}
}catch (Exception e) {
// TODO: handle exception
}
obj=queue[getIndex];
count--;
getIndex++;
if(getIndex==queue.length){
getIndex=0;
putConditon.signal();//通知放进程
}
}finally{
lock.unlock();
}
return obj;
}
public void putData(Object obj){
lock.lock();
try{
try{
while(count==queue.length)
putConditon.await();
}catch (Exception e) {
// TODO: handle exception
}
queue[putIndex]=obj;
putIndex++;
count++;
if(putIndex==queue.length){
putIndex=0;
}
getConditon.signal();
}finally{
lock.unlock();
}
}
}