初识阻塞队列
Posted 无赖H4
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识阻塞队列相关的知识,希望对你有一定的参考价值。
阻塞队列
阻塞队列表现为通知模式的队列。生产者因为队列满了而阻塞在队列上,直到队列不满时被通知唤醒。
java.concurrent.BlockingQueue <E> interface
继承自 java.util.Queue <E> 队列
concurrent:并发
parallel:并行
java.util.concurrent juc包
ArrayBlockingQueue 数组阻塞队列(循环队列)
实现阻塞队列的(wait/notify)——循环阻塞队列
关键操作是——while(){wait()}
和notify();
常见的:
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
生产者-消费者模型
生产者消费者模型就是通过一个容器来解决之间的耦合问题。中间的容器用阻塞队列实现。
例如:
生产者负责放,消费者负责取
模拟实现阻塞队列
public class MyArrayBlockingQueue {
private final String[] array;
private int size;
private int frontIdx;
private int tailIdx;
public MyArrayBlockingQueue(int capacity) {
array = new String[capacity];
size = 0;
frontIdx = 0;
tailIdx = 0;
}
public synchronized void put(String e) throws InterruptedException {
while (size == array.length) {
wait();
}
// 走到这里时,假设队列一定不是满的
array[tailIdx] = e;
size++;
tailIdx++;
// 循环
if (tailIdx == array.length) {
tailIdx = 0;
}
notifyAll();
}
public synchronized String take() throws InterruptedException {
while (size == 0) {
wait();
}
// 队列一定不是空的
String e = array[frontIdx];
size--;
frontIdx++;
if (frontIdx == array.length) {
frontIdx = 0;
}
notifyAll();
return e;
}
}
以上是关于初识阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章