初识阻塞队列

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;
    }
}

以上是关于初识阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章

初识阻塞队列

# Java 常用代码片段

# Java 常用代码片段

初识进程 线程 协程:协程

初识Lock与AbstractQueuedSynchronizer(AQS)

8.初识Lock与AbstractQueuedSynchronizer(AQS)