• BlockingQueue详解


    BlockingQueue详解

    简介

    BlockingQueue接口表示一个线程安全的放入和提取实例的队列.

    BlockingQueue和BlockingDequeue

    BlockingQueue

    常用于一个线程生产对象,一个线程消费对象.
    只从一端放入对象,从另外一端取出对象.

    • 一个线程持续生产对象并将其插入队列,直到达到队列的容量.
    • 如果阻塞队列到达临界点,则负责生产的线程在插入对象时阻塞,直到负责消费的线程从队列中取走一个线程.
    • 负责消费的线程会一直从队列中取走对象,直到队列为空.
    • 若队列为空,则负责消费的线程在提取对象时被阻塞,直到一个生产的线程把一个对象添加到队列.

    方法

    抛异常 返回特定值(true/false) 阻塞 超时
    插入 add(o) offer(o) put(o) offer(o,timeout,timeunit)
    移出 remove(o) poll(o) take(o) poll(timeout,timeunit)
    检查 element(o) peek(o)

    注:

    • 抛异常:若操作无法执行,则抛出异常.
    • 返回特定值:若操作完成,则返回true;否则返回false.
    • 阻塞:若无法执行,则阻塞该线程,直到可以执行.
    • 超时:若操作无法执行,则阻塞线程.若超过指定时间若无法执行,则返回false.
    • 不能插入null,否则抛出NullPointerException.
    • 基于队列的数据结构查找元素效率低.

    BlockingDeque

    一个线程安全的存放和提取实例的双端队列.

    • 不能插入元素时,阻塞试图插入元素的线程.
    • 不能提取元素时,阻塞试图提取元素的线程.
    • deque是"Double Ended Queue"的缩写,表示可以从任意一端插入或提取元素.
    • 在线程既是生产者又是消费者的情况下使用BlockingDeque.

    方法

    抛异常 返回特定值(true/false) 阻塞 超时
    插入 addFirst(o)/addLast(o) offerFirst(o)/offerLast(o) putFirst(o)/putLast(o) offerFirst(o,timeout,timeunit)/offerLast(o,timeout,timeunit)`
    移除 removeFirst(o)/removeLast(o) pollFirst(o)/pollLast(o) takeFirst(o)/takeLast(o) pollFirst(timeout,timeunti)/pollLast(timeout,timeunit)
    检查 getFirst(o)/getLast(o) peekFirst(o)/peekLast(o)

    BlockingDeque与BlockingQueue的关系:BlockingDeque接口继承于BlockingQueue接口.


    实现类

    数组阻塞队列ArrayBlockingQueue

    • 是一个有界阻塞队列,同一时间能够存储元素有限.
    • 基于数组存储元素,设定后无法修改.
    • 以FIFO顺序对元素进行存储.队列头元素为最先进入队列的元素,队列尾元素为最晚进入队列的元素.

    延迟队列DelayQueue

    • 对入队的元素设定一个延迟时间.
    • 只有经过指定的延迟时间后才能从队列中取出该元素.
    • 队列的元素必须实现Delayed接口,重写两个方法getDelaycompareTo,分别用来获取元素还剩下的延迟时间和比较不同元素用于在队列中排序.

    链阻塞队列LinkedBlockingQueue

    • 内部是链式结构对元素进行存储.
    • 可以设置容量.若没有设置容量,则使用Integer.MAX_VALUE作为上限.
    • 以FIFO的顺序对元素进行存储.

    具有优先级的阻塞队列PriorityBlockingQueue

    • 是一个无界的并发队列.
    • 无法插入null元素.
    • 存储的元素必须实现Comparale接口.
    • 不保证相同优先级的元素之间的相对位置.

    同步队列SynchronousQueue

    • 内部只能容纳单个元素.
    • 若队列已有一个元素,则向队列中插入元素的线程会被阻塞,直到另外一个线程从队列取走.
    • 若队列为空,则取走元素的线程会被阻塞,直到另外一个线程向队列中插入一个元素.

    链阻塞双端队列LinkedBlockingDeque

    • 为双端队列.
    • 队列为空时,从队列中抽取数据会被阻塞.
    • 可以从队列的两端提取元素.(takeFirst()takeLast())
  • 相关阅读:
    win10怎么还原系统【系统天地】
    win7电脑玩游戏不能全屏怎么办【系统天地】
    win10显卡驱动报错怎么办【系统天地】
    win7防火墙在哪里设置【系统天地】
    怎么开启Win10远程桌面连接【系统天地】
    Win7系统C盘空间太小怎么扩容【系统天地】
    vscode 运行创建Vue项目指令出现“因为在此系统上禁止运行脚本“报错解决办法
    关于性能测试的基础——Jmeter
    学习笔记-202008
    EEPROM和flash的区别
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13214007.html
Copyright © 2020-2023  润新知