阻塞对列:生产者消费者模型的一种方式
如果对列满了,此时在进行入对列,入队列操作就会阻塞等待,直到对列中存在空闲位置
如果对列为空,此时再进行出对列,出对列操作也会阻塞等待,直到对列中被放入数据
下面是代码的实现
static class BlackingQueue {
private int[] array = new int[1000];
private volatile int size = 0;
private volatile int head = 0;
private volatile int tail = 0 ;
//进队列
private void offer(int val) throws InterruptedException {
synchronized (this) {
while (size==array.length) {
this.wait();
}
array[tail] = val ;
tail++;
if (tail==array.length) { // 环形对列
tail=0;
}
size++;
//此处的通知是为了唤醒消费者来进行获取数据
notify();
}
}
//出对列
private int poll() throws InterruptedException {
int ret = 0 ;
synchronized (this) {
while (size==0) {
wait();
}
ret = array[head];
head++;
if (head==array.length) {
head=0;
}
size--;
//此处是为了唤醒生产者线程来进行插入数据
notify();
}
return ret;
}