首页 > 其他分享 >阻塞队列 - BlockingQueue

阻塞队列 - BlockingQueue

时间:2022-11-05 20:46:24浏览次数:54  
标签:同步 队列 阻塞 生产者 线程 ArrayBlockingQueue BlockingQueue

 线程通信的一个工具。在任意时刻,不管并发有多高,在单JVM上面,同一时间永远只有一个线程能够对队列进行入队或者出队操作。

1. 线程安全的队列;

2. 队列类型:无限队列、有限队列;

常见的4种阻塞队列:

  • ArrayBlockingQueue 由数组支持的有界队列
  • LinkedBlockingQueue 由链接节点支持的可选有界队列
  • PriorityBlockingQueue 由优先级堆支持的无解优先级队列
  • DelayQueue 由优先级堆支持的、基于时间的调度队列

应用场景:

1. 线程池,SpringCloud-Eureka的三级缓存,Nacos、Netty、MQ(RocketMQ)、生产者与消费者模型

例如ArrayBlockingQueue,其本质内部有一个ReetrantLock,如果线程想要操作这个队列之前,必须先获得这把锁。

 

 

 

 

 

 在BlockingQue内部执行deque和enque的时候,如果当前队列判了,会有一个await的操作,也就是上述列出的一张图的代码。

在这里面可以看到具体得执行流程。

这里要提出一个等待队列的概念,之前讲AQS的时候只讲到同步队列,同步队列是真正可以拿到cpu去执行线程的队列。而等待队列用于BlockingQueue可以很巧合地实现生产者和消费者之前入队和出队的操作,里面有两个内部变量notFull,notEmpty,有这两个条件变量在,可以很巧合地通知通知机制,消费者消费后去通知生产者进入同步队列执行放入数据到等待队列,生产者生产数据后可以去通知消费者到同步队列执行从等待队列取出数据。总之生产者和消费者总是在等待队列和同步队列之间来回切换。

下面见ArrayBlockingQueue的构造器和put方法。

public ArrayBlockingQueue(int capacity, boolean fair) {
    if(capacity <= 0){
        throw new IllegalArgumentException();
    }
    this.items = new Object[capacity];
    lock = new ReentrantLock(fair);        // 创建一把锁
    notEmpty = lock.newCondition();        // 条件对象
    notFull = lock.newCondition();        // 条件对象
}

public void put(E e) throws InterruptedException {
    checkNotNull(e);
    final ReentrantLock lock = this.lock;    // producer加锁
    lock.lockInterruptibly();                
    try {
        while(count == items.length)
            notFull.await();
        enqueue(e);
    } finally {
        lock.unlock();
    }
}

 

End!

标签:同步,队列,阻塞,生产者,线程,ArrayBlockingQueue,BlockingQueue
From: https://www.cnblogs.com/zhf123/p/16861022.html

相关文章

  • C++——优先级队列(priority_queue)
    其为队列需要包含头文件#include,其与queue的不同之处在于,可以自定义数据的优先级,让优先级高的排在队列的前面,优先出队;优先队列具有队列的所有特性,包括基本操作,只是在此基......
  • 单调栈&单调队列
    单调栈&单调队列&尺取PassingtheMessageHDU3410题意:给定n个数,找每一个数左边比它小的最大的数,右边比它小的最大的数,每个数不能越过一个比它大数数去找后面的数。解......
  • 7-1 Windows消息队列
    消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息加到队列当中。同时,如果队列不是空......
  • 12-组件篇之消息队列(1)_ev
               ......
  • C++——单调队列
    classSolution{public:classMyqueue//单调队列{public:deque<int>que;//因为只维护了队列最大值,故在pop时判断滑动窗口最......
  • 用队列结构,实现栈结构。(有图)
    packageclass03;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Stack;/***用队列结构,实现栈结构*/publicclassCode07_TwoQueuesI......
  • 使用数组实现队列。(有图)
    packageclass03;/***使用数组实现队列*先进先出*/publicclassCode04_RingArray{publicclassMyQueue{privateintpushIndex;//下一个要......
  • 双链表实现栈,和队列
    packageclass03;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Stack;/***双链表实现栈,和队列*/publicclassCode03_DoubleEndsQu......
  • 代码随想录day35 | 860.柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆
    860.柠檬水找零题目|文章思路这道题看上去很复杂,其实只要把每种情况写下来,答案就已经解决了。1.收到52.收到103.收到20实现点击查看代码classSolution{publi......
  • 04.动画队列
    01.创建动画队列//方式1Sequencesequence=DOTween.Sequence();//方式2DOTween.Sequence().Append()02.使用Sequencesequence=DOTween.Sequence();sequence.......