package com.example.polaris;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BlockedQueue<T> {
private int size;
private Object[] queue;
final Lock lock = new ReentrantLock();
// 条件变量:队列不满
final Condition notFull = lock.newCondition();
// 条件变量:队列不空
final Condition notEmpty = lock.newCondition();
private int index;
private int removeIndex;
private int currLen;
public BlockedQueue(int size) {
this.index = 0;
this.removeIndex = 0;
this.currLen = 0;
this.size = size;
queue = new Object[size];
}
// 入队
public void push(T element) throws InterruptedException {
lock.lock();
try {
while (currLen == size) {
System.out.println("队列已满,等待队列不满");
notFull.await();
}
queue[index] = element;
if (++index == size) {
index = 0;
}
currLen++;
notEmpty.signal();
} finally {
lock.unlock();
}
}
// 出对
public T pop() throws InterruptedException {
lock.lock();
try {
while (currLen == 0) {
System.out.println("队列已空,等待队列不空");
notEmpty.await();
}
Object obj = queue[removeIndex];
if (++removeIndex == size) {
removeIndex = 0;
}
currLen--;
notFull.signal();
return (T) obj;
} finally {
lock.unlock();
}
}
}