您的位置:首页 > 编程语言 > Java开发

Java:实现简单的阻塞队列

2017-05-17 21:40 573 查看
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息