系列十一、阻塞队列

news/2024/5/20 9:27:28 标签: JUC

一、栈 vs 队列

栈:先进后出,后进先出,例如:弹夹

队列:先进先出,后进后出,例如:食堂排队打饭

二、阻塞队列

2.1、概览图

阻塞队列也是队列中的一种,在数据结构中的作用大致如下所示:

 

线程1往阻塞队列里面添加元素,线程2往阻塞队列里面移除元素。

2.2、作用

        在多线程领域,所谓阻塞,就是某些线程在某些情况下回被挂起(即阻塞) ,一旦条件满足,被挂起的线程又会自动被唤起。那么为什么需要阻塞队列呢?好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,以为这一切阻塞队列(BlockingQueue)都给你一手包办了。在concurrent包发布以前,在多线程环境下,我们每个程序员都必须去控制这些细节,尤其还要兼顾效率和安全,而这会给我们的程序带来不小的复杂度,有了阻塞队列以后,我们程序员就不用去关心这些细节了,由阻塞队列自动帮我们控制,大大地解脱了程序员的工作。

2.3、架构介绍

2.4、种类分析 

2.4.1、ArrayBlockingQueue

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

2.4.2、LinkedBlockingQueue

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

2.4.3、PriorityBlockingQueue

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

2.4.4、DelayQueue

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

2.4.5、SynchronousQueue

不存储元素的阻塞队列,也即单个元素的队列。

2.4.6、LinkedTransferQueue

由链表组成的无界阻塞队列。

2.4.7、LinkedBlockingDeque

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

2.5、核心方法

方法类型抛出异常特殊值阻塞超时
插入add(e)offer(e)put(e)offer(e,time,unit)
移除remove()poll()take()poll(time,unit)
检查element()peek()不可用不可用

 

 

 

 

2.6、案例代码

2.6.1、add() & remove() & element()

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 19:21
 * @Description:
 */
public class BlockingQueueMainApp {

    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
        m1(blockingQueue);
    }

    /**
     * 第一组:add()、remove()、element()
     * @param blockingQueue
     */
    private static void m1(BlockingQueue<String> blockingQueue) {
        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));
        System.out.println(blockingQueue.element());

        System.out.println(blockingQueue.add("d"));
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
    }

}

2.6.2、offer() & poll() & peek()

public class BlockingQueueMainApp {

    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
        m2(blockingQueue);

    }

    /**
     * 第二组:offer() & poll() & peek()
     * @param blockingQueue
     */
    private static void m2(BlockingQueue<String> blockingQueue) {
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("b"));
        System.out.println(blockingQueue.offer("c"));
        System.out.println(blockingQueue.offer("d"));
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
    }

}

2.6.3、put() & take()

public class BlockingQueueMainApp {

    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
        m3(blockingQueue);
    }

    /**
     * 第三组:put() & take()
     * @param blockingQueue
     */
    private static void m3(BlockingQueue<String> blockingQueue) {
        try {
            blockingQueue.put("a");
            blockingQueue.put("b");
            blockingQueue.put("c");
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

2.6.4、offer() & poll()

public class BlockingQueueMainApp {

    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
        try {
            System.out.println(blockingQueue.offer("a"));
            System.out.println(blockingQueue.offer("b"));
            System.out.println(blockingQueue.offer("c"));
            System.out.println(blockingQueue.offer("c", 3L, TimeUnit.SECONDS));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


http://www.niftyadmin.cn/n/5197733.html

相关文章

指令系统、流水线

指令系统 分类 寻址方式 设计 能够改变控制流的指令&#xff1a;分支、跳转、过程调用、过程返回 操作码设计 MIPS 流水线 MIPS流水线 改进后 取指&#xff08;IF&#xff09; 译码&#xff08;ID&#xff09; 执行&#xff08;EX&#xff09; 存储器访问 寄存器-寄存器 A…

golang学习笔记——快速交换

普通交换 普通交换需要三行代码 aa : 10bb : 20//普通交换temp : bbbb aaaa temp快速交换 快速交换两个数只需要一行代码 package main import "fmt"func main() {aa : 10bb : 20fmt.Println(aa, bb)//快速交换aa, bb bb, aafmt.Println(aa, bb)a : 10b : 20c …

Flink Operator 使用指南 之 全局配置

背景 在上一个章节中已经介绍了基本的Flink-Operator安装,但是在实际的数据中台的项目中,用户可能希望看到Flink Operator的运行日志情况,当然这可以通过修改Flink-Operator POD的文件实现卷挂载的形势将日志输出到宿主机器的指定目录下,但是这种办法对数据中台的产品不是…

如何挖掘xss漏洞

如何挖掘xss漏洞 对于如何去挖掘一个xss漏洞我是这样理解的 在实战情况下不能一上来就使用xss语句来进行测试很容易被发现 那这种情况该怎么办呢 打开准备渗透测试的web网站&#xff0c;寻找可以收集用户输入的地方比如搜索框&#xff0c;url框等 发现后寻找注入点 选在输入…

广州一母婴店因设置0元购导致关店

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 广州的一家母婴用品网店Minitutu因双十一优惠券设置错误&#xff0c;导致所有商品变成0元购买&#xff0c;引发消费者疯狂抢购&#xff0c;15万多单订单中有800多万元的损失。店家无奈之下只能暂停营…

C++类与对象(3)—拷贝构造函数运算符重载

目录 一、拷贝构造函数 1、定义 2、特征 3、内置与自定义类型 4、const修饰参数 5、默认生成 浅拷贝 深拷贝 6、总结 二、运算符重载 1、定义 2、判断是否相等 3、比较大小 4、赋值 5、总结 一、拷贝构造函数 1、定义 拷贝构造函数&#xff1a;只有单个形参…

【文末附资料链接】2023年第十三届亚太杯数学建模竞赛(APMCM)优秀参考论文思路指导(持续更新中ing)

一、赛事介绍 数学建模作为一门跨学科的科学&#xff0c;不仅需要对数学知识的熟练掌握&#xff0c;还需要对实际问题的深刻理解和解决问题的创新思维。亚太杯数学建模竞赛旨在激发青年学子的创造力和团队协作精神&#xff0c;培养其在实际问题中运用数学方法解决现实挑战的能力…

刷题笔记day27-回溯算法1

理论基础 77. 组合 class Solution:path: list list()result: List[List[int]] list()def traversal(self, left: int, n: int, k: int):# 终止条件if (len(self.path) k):# 这里面需要用浅拷贝&#xff0c;而不能是引用self.result.append(copy.copy(self.path))# print(…