BlockingQueue阻塞队列

这篇具有很好参考价值的文章主要介绍了BlockingQueue阻塞队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

BlockingQueue阻塞队列

BlockingQueue简介

juc包下,BlockingQueue很好的解决了多线程中,高效安全的"传输数据"问题。
阻塞队列,是一个队列,可以是数据从队列的一端输入,从另一端输出。
BlockingQueue阻塞队列
当队列空时,从队列获取元素线程被阻塞,直到其他线程向空的队列插入新元素。
当队列满时,向队列添加元素线程被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来后新增。
在多线程中,阻塞是指在某些情况下,挂起线程,一旦条件满足,被挂起的线程被自动唤醒。

队列和栈

队列 FIFO(先进先出)
栈 FILO(先进后出)

常用的BlockingQueue子类

ArrayBlockingQueue(常用)

由数组结构组成的有界阻塞队列。

LinkedBlockingQueue(常用)

由链表结构组成的有界(大小默认值为Integer.MAX_VALUE)阻塞队列。

DelayQueue

使用优先级队列实现的延迟无界阻塞队列。

PriorityBlockingQueue

支持优先级排序的无界阻塞队列。

SynchronousQueue

该队列在创建时,有两种模式,公平和非公平。
公平模式会采用公平锁,并使用队列来阻塞多余的生成者和消费者,从而实现整体的公平策略。
非公平模式,采用非公平锁,且使用栈来阻塞多余的生产者和消费者,这种模式下,如果生产者和消费者的处理速度存在差距,则很容易出现饥渴的情况,即可能出现生产不足(消费者在等待生产者),或者生产过剩(有些元素,永远不会被消费)。
总结,不存储元素的同步队列,即存储单个元素的对列。

LinkedBlockingDeque

由链表组成的双休阻塞队列。

BlockingQueue核心方法

BlockingQueue阻塞队列

方法使用代码
/**
 * @author 长名06
 * @version 1.0
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);

        //第一组
        //add方法无空间可添加元素,抛IllegalStateException("Queue full")异常 有空间可添加元素,返回true
//        System.out.println(blockingQueue.add("wind-风"));//
//        System.out.println(blockingQueue.add("flower-花"));
//        System.out.println(blockingQueue.add("snow-雪"));
//        System.out.println(blockingQueue.add("moon-月"));
        //System.out.println(blockingQueue.element());

          //remove方法,无元素可用,抛NoSuchElementException异常 有元素可用,返回元素
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());

        //第二组
        //offer(E e)方法 无空间可添加元素,返回false 有空间可用添加元素,返回true
        //还存在offer(E e)的重载方法offer(E e, long timeout, TimeUnit unit) 对应第四组
        //无空间可添加元素,会等待一段时间,看是否有空间可用添加元素,等待时间内有,添加 没有就返回false
        //有空间可用添加元素,返回true
//        System.out.println(blockingQueue.offer("wind-风"));
//        System.out.println(blockingQueue.offer("flower-花"));
//        System.out.println(blockingQueue.offer("snow-雪"));
//        System.out.println(blockingQueue.offer("moon-月"));
//
          //poll方法,无元素可用,返回null 有元素可用,返回元素
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
        //第三组
        //put方法注释
        //Inserts the specified element into this queue, waiting if necessary for space to become available.
        //put方法,如果队列已满,就一直等待,直到队列可用添加元素 put方法无返回值
        blockingQueue.put("wind-风");
        blockingQueue.put("flower-花");
        blockingQueue.put("snow-雪");
        System.out.println("队列已满");
        System.out.println(blockingQueue.offer("moon-月", 3L, TimeUnit.SECONDS));
//        blockingQueue.put("moon-月");

        //take方法注释
        //Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
        //take方法,不为空返回元素 如果队列为空,就一直阻塞,等待队列中有元素可用
//        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take());
//        System.out.println("队列已空");
//        blockingQueue.take();

        //第四组
        //poll方法注释
        //Retrieves and removes the head of this queue, waiting up to the specified wait time if necessary for an element to become available.
        //poll方法,取元素,如果队列不为空,返回元素
        // 如果队列为空,会等待一段时间,看是否有元素可用,没有就返回null
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
    }
}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。文章来源地址https://www.toymoban.com/news/detail-747389.html

到了这里,关于BlockingQueue阻塞队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是Java中的阻塞队列和非阻塞队列?

    首先,让我们从基础概念开始。在计算机科学中,数据结构可以分为两种:队列和管道。队列是一种先进先出(FIFO)的数据结构,你可以想象成排队买电影票的情况。你加入队伍的时候,你可以决定站在哪里,但是一旦决定站在哪里,你就不能改变位置。而一旦你到达队尾,

    2024年02月14日
    浏览(46)
  • 【数据结构-队列】阻塞队列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月09日
    浏览(39)
  • 阻塞队列(消息队列)

    队列是一种先进先出的数据结构。而阻塞队列也是一种特殊的队列,也遵守”先进先出“的原则。 阻塞队列是一种线程安全的的数据结构,并且具有以下 特性 : 1、队列往进写元素是从队尾插入,队首取出 2、当插入元素的时候,先判断一下,队列是否已经满了,如果满了就

    2024年02月11日
    浏览(46)
  • 阻塞队列是什么

    (1) 栈与队列 1)栈:先进后出,后进先出 2)队列:先进先出 (2) 阻塞队列 阻塞:必须要阻塞/不得不阻塞 阻塞队列是一个队列,在数据结构中起的作用如下图: 1)当队列是空的,从队列中获取元素的操作将会被阻塞。 2)当队列是满的,从队列中添加元素的操作将会被阻塞

    2024年02月13日
    浏览(40)
  • 10.阻塞队列和线程池

    阻塞队列(BlockQueue) 非阻塞方法 add 往满的队列中添加元素会报错 remove 从空的队列中移除元素会报错 offer 往满的队列中添加元素会返回false poll 从空的队列中移除元素会返回null 阻塞方法 put take 使用场景: 阻塞队列通常使用在生产者消费者设计模式当中,生产者不用关心生成的

    2024年02月04日
    浏览(35)
  • 阻塞队列(JAVA)

    阻塞队列是一种特殊的队列,也遵守 \\\"先进先出\\\" 的原则。 阻塞队列能是一种 线程安全的数据结构 , 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素; 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素。  

    2024年02月02日
    浏览(36)
  • 阻塞队列.

    目录 ♫什么是阻塞队列 ♫什么是生产-消费者模式 ♫实现一个阻塞队列 ♫BlockingQueue 阻塞队列是一种特殊的队列,它除了具备队列的先进先出的特点外,还具有以下特点: ♩. 如果队列为空时,执行出队列操作,会阻塞等待,直到另一个线程往队列里添加元素(队列不为空)

    2024年02月08日
    浏览(62)
  • 阻塞队列的原理及应用

    阻塞队列是一种常用的并发编程工具,它能够在多线程环境下提供一种安全而高效的数据传输机制。本文将介绍阻塞队列的原理和使用场景,并通过实例演示其在多线程编程中的应用。 阻塞队列是一种特殊的队列,它具有以下几个特点: 阻塞特性:当队列为空时,从队列中

    2024年02月10日
    浏览(36)
  • Qt QQueue 安全的多线程队列、阻塞队列

    在C++中,queue是一个模板类,用于实现队列数据结构,遵循先进先出的原则。 ♦ 常用方法: · ♦ 简单使用: · ♦ 打印: · QQueue 继承与 QList ♦ 常用方法: · ♦ 实例: · ♦ 打印: · 在多线程编程中,由于QQueue并不是线程安全的,因此我们需要先使用互斥锁(QMutex)来保

    2024年02月16日
    浏览(39)
  • 【Linux驱动】Linux阻塞IO —— 阻塞读取按键状态(等待队列实现)

    上一节获取按键状态时,是在应用层以循环的方式不断读取按键状态,但是我们实际关注的只是当按键被按下时发生的情况,所以大多数时间拿到的状态都是我们不需要的结果。 对此,当按键被释放时,让 read 接口处于阻塞状态,等按键被按下再解除阻塞。 要使用等待队列

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包