• 队列-阻塞队列


    场景:海底捞候客区、医院体检候客区、银行候客区

    手动挡换成自动挡

    集合除了ArrayList、linkedList还用过哪些?-> CopyOnWriteArrayList、BlockingQueue

    一、阻塞队列是什么?

    阻塞队列首先是一个队列,当队列是空的时候,从队列获取元素的操作将会被阻塞,当队列是满的时候,从队列插入元素的操作将会被阻塞。 image

    消息中间件底层用的就是阻塞队列。

    二、阻塞队列好处

    在多线程领域,所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。

    为什么需要使用BlockingQueue? 
    好处是我们不需要关心什么时候去阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQue都给你一手包办了。

    在Concurrent包发布以前,在多线程环境下,我们每个程序员都要去控制这些细节,尤其还要兼顾效率与线程安全,这会给我们的程序带来不小的复杂度。

    三、阻塞队列BlockingQueue接口架构图

    image

    四、阻塞队列BlockingQueue种类

    1. ArrayBlockingQueue:由数组结构组成的有界阻塞队列。
    2. LinkedBlockingQueue:由链表结果组成的有界阻塞队列(默认大小Integer.MAX_VALU - 21亿)阻塞队列。
    3. SychronousQueue:不存储元素的阻塞队列,也即单个元素队列。
    4. PriorityBlockingQueue:支持优先级排序的无界阻塞队列。
    5. DelayQueue:使用优先级队列实现的延迟无界阻塞队列。
    6. LinkedTransferQueue:由链表结构组成的无界阻塞队列。
    7. LinkedBlockingDeque:由链表结构组成的双端阻塞队列。

    五、阻塞队列BlockingQueue核心方法

    image

    1. 抛出异常的方法 
      当阻塞队列满时,再往队列里add元素会抛出IllegalStateException:Queue full; 
      当阻塞队列空时,再从队列里remove移除元素会抛NoSuchElementException。
    2. 返回特殊值(boolean值)的方法 
      插入成功,返回true;插入失败,返回false; 
      删除成功返回出队列元素;删除失败返回null;
    3. 阻塞的方法 
      当阻塞队列满时,生产者线程继续往队列里put元素,队列会一直阻塞生产线程直到put数据or响应中断退出。 
      当阻塞队列空时,消费者线程试图take队列里的元素,队列会一直阻塞消费者线程直到队列有可用元素。
    4. 超时的方法 
      当向阻塞队列offer元素时候,时间超过了设定的值,就会出现超时中断; 
      当向阻塞队列poll元素时候,时间超过了设定的值,就会出现超时中断。

    六、阻塞队列BlockingQueue核心方法代码验证

    public class BlockingQueueDemoOne {
    
        public static void main(String[] args) throws InterruptedException {
            BlockingQueue queue = new ArrayBlockingQueue(5);
            queue.put("吴用");
            queue.put("宋江");
            queue.put("李逵");
            queue.put("卢俊义");
            queue.put("高俅");
    
            // 此时再往阻塞队列put一个元素时,会阻塞队列
            // queue.put("武松");
            queue.take();
            queue.take();
            queue.take();
            queue.take();
            queue.take();
    
            // 此时再往阻塞队列take一个元素时,会阻塞队列
            queue.take();
        }
    }
    
    

    七、LinkedBlockingQueue和ArrayBlockingQueue的异同

    https://www.cnblogs.com/lianliang/p/5765349.html

  • 相关阅读:
    LoadRunner使用记录
    JVM&GC详解
    常用网络操作命令
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址详解
    交换机配置记录
    持续集成与自动化部署---代码流水线管理及Jenkins和gitlab集成
    Git的安装与使用详解
    性能测试---问题记录
    性能测试---实战篇
    c++实用快捷键
  • 原文地址:https://www.cnblogs.com/xhyouyou/p/12465296.html
Copyright © 2020-2023  润新知