定义:当队列超过定义的大小时,会禁止(阻塞)插入数据,直至队列数据不满;当队列中没有数据时,会禁止(阻塞)数据弹出,直至数据有数据。Java中常见的阻塞队列:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue等
手写一个简单的阻塞队列
package cn.zxw.test;
import java.util.Stack;
/**
* @author zxw
* @version 1.0
* @description 手写简单的阻塞队列
* @data: 2020/3/12 21:39
*/
public class TestQueue<T> {
/**插入锁和弹出锁*/
public static Object pushLock = new Object();
public static Object popLock = new Object();
/**设置最小值和队列最大值以及存数据区域*/
private int minSize = 0;
private int maxSize = 0;
private Stack<T> stack;
/**构造传入最大值*/
public TestQueue(int size){
this.maxSize = size;
stack = new Stack<T>();
}
/**
* 插入数据
* @param t 数据
* @return 是否成功
*/
public synchronized boolean push(T t){
if (stack.size() >= maxSize){
pushLock();
return false;
}
stack.push(t);
pushUnLock();
return true;
}
public synchronized T pop(){
if (stack.size() == minSize){
popLock();
}
T t = stack.pop();
popUnLock();
return t;
}
private void pushLock(){
synchronized (pushLock){
try {
pushLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void pushUnLock(){
synchronized (pushLock){
pushLock.notifyAll();
}
}
private void popLock(){
synchronized (popLock){
try {
popLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void popUnLock(){
synchronized (popLock){
popLock.notifyAll();
}
}
}