public class MyBlockedQueue {
private int[] array;
private int head;
private int last;
private int size;
public MyBlockedQueue(int maxSize) {
this.head = 0;
this.last = 0;
array = new int[maxSize];
}
public synchronized void offer(int e) throws InterruptedException {
while (size == array.length) {//没有更多空间,需要阻塞
wait();
}
if (last != array.length - 1) {
array[++last] = e;
} else {
array[0] = e;
last = 0;
}
size++;
notify();//达到了唤醒poll方法的条件
}
public synchronized int pool() throws InterruptedException {
while (size == 0) {//没有数据,阻塞
wait();
}
int returnValue = array[head];
if (head != 0) {
head--;
} else {
head = array.length-1;
}
size--;
notify();//达到了唤醒offer方法的条件
return returnValue;
}
}
下面是测试代码
public static void main(String[] args) {
final MyBlockedQueue blockedQueue = new MyBlockedQueue(2);
new Thread(new Runnable() {
public void run() {
try {
blockedQueue.offer(1);
System.out.println("insert 1");
blockedQueue.offer(2);
System.out.println("insert 2");
blockedQueue.offer(3);
System.out.println("insert 3");
blockedQueue.offer(4);
System.out.println("insert 4");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(3000);
blockedQueue.pool();
Thread.sleep(3000);
blockedQueue.pool();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();