public class TestBlockArray {
private int[] arr;
private Condition notEmpty;
private Condition notFull;
private ReentrantLock lock;
private int putIndex;
private int getPutIndex;
private int count;
public static void main(String[] args) throws InterruptedException {
TestBlockArray testBlockArray = new TestBlockArray(4, true);
testBlockArray.poll(1);
testBlockArray.poll(2);
testBlockArray.poll(3);
testBlockArray.poll(4);
System.out.println(testBlockArray.take());
System.out.println(testBlockArray.take());
System.out.println(testBlockArray.take());
System.out.println(testBlockArray.take());
//System.out.println(testBlockArray.take());
//System.out.println(testBlockArray.take());
testBlockArray.poll(5);
testBlockArray.poll(6);
System.out.println(testBlockArray.take());
System.out.println(testBlockArray.take());
}
public TestBlockArray(int cap, boolean fair){
lock = new ReentrantLock(fair);
notFull = lock.newCondition();
notEmpty = lock.newCondition();
arr = new int[cap];
}
public boolean poll(int item){
lock.lock();
try {
while (count == arr.length){
notFull.await();
}
enq(item);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return true;
}
public int take() throws InterruptedException {
lock.lock();
try{
while (count == 0){
notEmpty.await();
}
return deq();
}finally {
lock.unlock();
}
}
public void enq(int item){
arr[putIndex] = item;
if (++putIndex == arr.length) {
putIndex = 0;
}
count ++;
notEmpty.signal();
}
public int deq(){
int ret = arr[getPutIndex];
if (++getPutIndex == arr.length){
getPutIndex = 0;
}
count --;
notFull.signal();
return ret;
}
}
阻塞队列例子
最新推荐文章于 2024-08-09 09:30:00 发布