使用Condition(条件锁)实现有序队列 |
---|
/**
-
有序队列
*/
public class ScopeQueue {private Object[] objects;//元素存放队列
private int addIndex;//添加角标
private int removeIndex;//删除角标
private volatile int size;//队列元素个数
private Lock lock=new ReentrantLock();
private Condition addLock=lock.newCondition();//添加条件锁
private Condition removeLock=lock.newCondition();//删除条件锁//默认长度队列
public ScopeQueue() {
this.objects = new Object[10];
}//指定长度队列 构造
public ScopeQueue(int length) {
this.objects = new Object[length];
}//添加方法
public void add(E e){
lock.lock();
while (sizeobjects.length){
//这里表示队列已经满了,则不添加。
try {
removeLock.signalAll();//唤醒所有的删除线程
System.out.println(Thread.currentThread().getName()+" 移除线程进行唤醒。。。。。。");
System.out.println(Thread.currentThread().getName()+" 添加线程进行等待。。。。。。");
addLock.await();//使当前线程沉睡
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
objects[addIndex]=e;//将元素添加进去 然后指针往后移。
System.out.println(Thread.currentThread().getName()+" 添加 "+e);
size++;//队列长度+1。
if (++addIndexobjects.length){//将添加索引重置
addIndex=0;
}
lock.unlock();
}//删除方法
public void remove(){
lock.lock();
while (size0){
//这里表示队列已经没有元素了,进行等待。
try {
addLock.signalAll();//唤醒所有的添加线程
System.out.println(Thread.currentThread().getName()+" 添加线程进行唤醒。。。。。。");
System.out.println(Thread.currentThread().getName()+" 移除线程进行等待。。。。。。");
removeLock.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" 删除 "+objects[removeIndex]);
objects[removeIndex]=null;//将元素置为null
size–;//队列长度-1
if (++removeIndexobjects.length){
removeIndex=0;
}
lock.unlock();
}
}