阻塞队列(BlockingQueue)

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

阻塞队列(BlockingQueue)

阻塞队列(BlockingQueue)


  • 阻塞队列都实现了:BlockingQueue
  • JDK提供的七个阻塞队列
    阻塞队列(BlockingQueue)

一、特点

1、JDK提供的七个阻塞队列简介

①. ArrayBlockingQueue

有界 阻塞队列——必须指定大小——数组

②. LinkedBlockingQueue

有界 阻塞队列——默认大小:Integer.MAX_VALUE最大值——链表

③. LinkedTransferQueue

无界 阻塞队列——链表

④. PriorityBlockingQueue

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

⑤. DelayQueue

无界 阻塞队列——使用优先级队列实现的

⑥. SynchronousQueue

不存储元素 的阻塞队列

⑦. LinkedBlockingDeque

双端 阻塞队列——链表

2、其他特点

  • 阻塞队列默认情况下是FIFO(先进先出)PriorityBlockingQueue可以设置优先级出队列
  • BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。
  • BlockingQueue 实现是线程安全

二、阻塞队列的方法

  • e 表示插入到队列的元素
  • 其他特殊的方法,见参考。
  • 常用方法
阻塞队列的核心方法有以下几组
1.抛异常组:add(),remove(),element();
2.返回布尔值组:offer(),poll(),peek();
3.阻塞组:put(),take();
4.超时组:offer(),poll();

1、插入元素

描述 抛出异常 一直阻塞 返回特殊的值 超时退出
插入数据 add(e) put(e) offer(e)
推荐
offer(e, time, unit)
推荐
插入成功 返回true 无返回值 返回true 返回true
插入失败
(队列满)
抛异常 一直阻塞,直到插入元素 返回false 等10秒(假如设置的10s)
然后放弃插入返回false
可用于控制添加元素的速度

2、获取元素——并移除队列的头元素

描述 抛出异常 一直阻塞 返回特殊的值 超时退出
获取元素 remove() take() poll() poll(time, unit)
获取成功 返回元素 返回元素 返回元素 返回元素
获取失败
(队列空)
抛异常 一直阻塞,直到获取到元素 返回null 等10秒(假如设置的10s)
然后null
可用于控制消费的速度

3、获取元素——不移除队列的元素

描述 抛出异常 返回特殊的值
获取元素 element() peek()
获取成功 返回元素 返回元素
获取失败
(队列空)
抛异常 返回null

4、推荐使用

  • 一般情况下 offer() 和 poll() 方法配合使用

程序中常用的是 offer() 和 poll() 方法,因为这两个方法比较友好,不会报错

  • put() 和 take() 阻塞方法配合使用
  • add() 和 remove() 方法会配合使用

5、测试

  • 自己去测
package com.cc.testproject.utils;

import java.time.LocalDateTime;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.PriorityBlockingQueue;

/**
 * <p>存放队列</p>
 *
 * @author --
 * @since 2024/1/9
 */
public class Task01 {

    //有界阻塞队列——FIFO(先进先出)——必须指定大小——数组
    private static final ArrayBlockingQueue<String> QUEUE1 = new ArrayBlockingQueue<>(1);
    //有界阻塞队列——FIFO(先进先出)——默认大小:int最大值——链表
    private static final LinkedBlockingQueue <String> QUEUE2 = new LinkedBlockingQueue<>();
    //无界阻塞队列——FIFO(先进先出)——无限大——链表
    private static final LinkedTransferQueue <String> QUEUE3 = new LinkedTransferQueue<>();

    public static void main(String[] args) throws InterruptedException {

        boolean offer = QUEUE1.offer("1");
        System.out.println("第1次添加:" + offer + "-时间:" + LocalDateTime.now());
        boolean offer1 = QUEUE1.offer("2");
        System.out.println("第2次添加:" + offer1 + "-时间:" + LocalDateTime.now());

        System.out.println(QUEUE1.take());

//        System.out.println(QUEUE1.element());
        System.out.println(QUEUE1.peek());
        System.out.println(QUEUE1);

//        System.out.println(QUEUE1.poll(5, TimeUnit.SECONDS));
//        System.out.println(QUEUE1.poll());
//        System.out.println(QUEUE1.remove());
//        System.out.println(QUEUE1.take());

//        System.out.println(QUEUE1.remove());
//        System.out.println(QUEUE1.remove());
//        System.out.println(QUEUE1.take());
//        System.out.println(QUEUE1.take());
//        System.out.println(QUEUE1.poll());
//        System.out.println(QUEUE1.poll(5, TimeUnit.SECONDS));

        //如队列满:等10秒,然后放弃插入,返回false
//        boolean offer = QUEUE1.offer("1", 10, TimeUnit.SECONDS);
//        System.out.println("第1次添加:" + offer + "-时间:" + LocalDateTime.now());
//        boolean offer1 = QUEUE1.offer("2", 10, TimeUnit.SECONDS);
//        System.out.println("第2次添加:" + offer1 + "-时间:" + LocalDateTime.now());
//
//        System.out.println("添加完成:" + QUEUE1);

        // 如队列满:抛异常
//        boolean add1 = QUEUE1.add("1");
//        System.out.println("第1次添加:" + add1);
//        boolean add2 = QUEUE1.add("2");
//        System.out.println("第2次添加:" + add2);

        //如队列满:一直等
//        QUEUE1.put("1");
//        System.out.println("第1次添加:" + LocalDateTime.now());
//        QUEUE1.put("2");
//        System.out.println("第2次添加:" + LocalDateTime.now());
    }
}

三、使用场景、个人理解

1、使用场景

  • 需要顺序执行,且是耗时操作,可用来装用户的请求

  • 阻塞队列在多线程编程中有许多使用场景,包括但不限于:

  1. 生产者-消费者模式:用于在生产者和消费者之间进行线程安全的数据交换。
  2. 任务调度:用于实现线程池中的任务队列,控制任务的提交和执行。
  3. 数据传输:用于在不同线程之间传递数据,例如在生产者和消费者之间传递数据。
  4. 事件驱动编程:用于在事件处理中进行线程间通信和协调。
  5. 限流和流量控制:用于控制系统的并发访问量,防止系统过载。

阻塞队列(BlockingQueue)

2、个人理解

  • 阻塞队列之所以叫阻塞队列,是因为它可以在添加或者获取元素的时候阻塞添加或获取的线程。直到线程达到自己的目的。
  • 阻塞队列之所以被称为阻塞队列,是因为当队列已满时,尝试向队列中添加元素的线程会被阻塞,直到队列有空间为止;当队列为空时,尝试从队列中获取元素的线程会被阻塞,直到队列中有元素为止。这种行为可以确保线程安全地在队列中添加或获取元素。

四、参考:

阻塞队列(BlockingQueue)文章来源地址https://www.toymoban.com/news/detail-777099.html

  • 双端队列,其他队列感兴趣的,可以见下面:
    1、 或 这里
    2、 或 这里
    3、 或 这里
    4、https://blog.51cto.com/u_16099200/7290591

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(58)
  • 阻塞队列(JAVA)

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

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

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

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

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

    2024年02月02日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包