JDK中自带ArrayBlockingQueue、ListBlockingQueue等阻塞的队列。我们也可以认为自己实现一个。
public class BlockQueue<T> {
// push的锁
private final static Object pushLock = new Object();
// pop的锁
private final static Object popLock = new Object();
// 存储数据
private Stack<T> stack;
public BlockQueue() {
stack = new Stack<>();
}
public synchronized void push(T t) {
int MAX_SIZE = 3;
if (stack.size() >= MAX_SIZE) {
// 超过了最大长度,那么就等待
pushLock();
}
stack.push(t);
// 解开pop的锁
popUnlock();
}
public T pop() {
if (stack.size() == 0) {
// 不能pop,那么就等待
popLock();
}
T t = stack.pop();
// 解开push的锁
pushUnlock();
return t;
}
// push锁
private void pushLock() {
synchronized (pushLock) {
try {
pushLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 解开push锁
private void pushUnlock() {
synchronized (pushLock) {
pushLock.notify();
}
}
// pop锁
private void popLock() {
synchronized (popLock) {
try {
popLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 解开pop锁
private void popUnlock() {
synchronized (popLock) {
popLock.notify();
}
}
}
版权声明:本文为new_Aiden原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。