JAVA集合专题5 ——ArrayDeque + BlockingQueue

news2024/11/14 0:42:52

目录

      • ArrayDeque的特点
      • BlockingQueue
        • 什么是BlockingQueue?
        • 什么叫阻塞队列?
        • 阻塞队列的应用场景是什么?
        • BlockingQueue的阻塞方法是什么?
        • BlockingQueue的四类方法
          • code
          • code2

ArrayDeque的特点

  • ArrayDeque是Deque接口子实现
  • ArrayDeque数据结构可以表示为: 队列、双端队列、栈
  • ArrayDeque是一个循环数组
  • ArrayDeque底层数组的默认初始长度16,默认扩容机制扩为原来的2倍
  • ArrayDeque存储数据有序
  • ArrayDeque允许存储重复数据
  • ArrayDeque不允许存储null
  • ArrayDeque线程不安全
  • 如果我们在使用ArrayDeque的时候,在其构造方法中传入指定的数组长度,它会对这个给定长度进行处理。默认底层数组长度是8,如果给的值大于等于8那么会产生一个大于这个给定值的最小的2的幂值作为最终的底层数组长度
    给定10 -> 数组实际长度是16
    给定20 -> 数组实际长度是32
    给定40 -> 数组实际长度是64
    给定64 -> 数组实际长度是128
    即ArrayDeque的底层数组长度永远保持2的幂值
//底层源码
//                                  假设给定20 
private static int calculateSize(int numElements) {
    
    	// int MIN_INITIAL_CAPACITY = 8;
        int initialCapacity = MIN_INITIAL_CAPACITY;
       
         //   20 >= 8
        if (numElements >= initialCapacity) {
            // initialCapacity = 20
            initialCapacity = numElements;
            
            // initialCapacity = 20
            //                  10100
            
            // 第一步:
            // >>>  1           01010
            //                  10100
            // |                11110
            
            initialCapacity |= (initialCapacity >>>  1);
            
            // 第二步:
            // >>>  2           00111
            //                  11110
            // |                11111
            initialCapacity |= (initialCapacity >>>  2);
            
            // 第三步:
            // >>>  4           00001
            //                  11111
            // |                11111
            initialCapacity |= (initialCapacity >>>  4);
            initialCapacity |= (initialCapacity >>>  8);
            initialCapacity |= (initialCapacity >>> 16);
            
            //                 11111
            // ++
            //                100000
           
            initialCapacity++;

            if (initialCapacity < 0)   // Too many elements, must back off
                initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
        }
        return initialCapacity;
    }

BlockingQueue

什么是BlockingQueue?

BlockingQueue是阻塞队列

什么叫阻塞队列?

是一个大小容量有限的队列

  • 在添加数据的时候,如果队列满了,那么添加线程等待(直到有一个线程删除了队列中的元素,添加线程才可以往里面添加元素)
  • 在删除数据的时候,如果队列空了,那么删除线程等待(直到有一个线程往队列中添加了元素,删除线程才可以进行删除操作)

阻塞队列的应用场景是什么?

  • 缓存
  • 生产者-消费者模型

BlockingQueue的阻塞方法是什么?

普通的阻塞方法:(不满足条件, 一直阻塞)

  • put() —— 在添加数据的时候,,如果队列满了,put操作等待
  • take() —— 在删除数据的时候,如果队列空了,take操作等待

超时阻塞(不满足条件,会等待一段时间,在这个设置的时间内没有等到结果,返回特殊值null或false)

  • offer(e, time, unit) —— 没插入成功,返回false
  • poll( time, unit) —— 没取出元素,返回null

BlockingQueue的四类方法

在这里插入图片描述

code
package cs.kaoyan.javase.com.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        //阻塞队列容量为2
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(2);

        //先向队列中添加两个元素
        queue.add("zhang san");
        queue.add("li si");

        //add方法:报错IllegalStateException: Queue full
        //queue.add("wang wu");

        //put方法:阻塞
        //队列已满
        //queue.put("wang wu");

        //十秒之后还没添加成功会返回true
        //boolean result = queue.offer("wang wu", 10, TimeUnit.SECONDS);
        //false
        //System.out.println(result);

        ArrayBlockingQueue<String> queue2 = new ArrayBlockingQueue<>(2);

        //队列为空,无元素可取,返回null
        //String poll = queue2.poll();
        //System.out.println(poll);

        //队列为空,无元素可取,阻塞
        queue2.take();
    }
}
code2
package cs.kaoyan.javase.com.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        //容量为2的阻塞队列
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(2);

        //先向队列中插入两个元素
        queue.offer("zhang san");
        queue.offer("li si");

        MyThread myThread = new MyThread(queue);
        //启动子线程
        myThread.start();

        //队列已满,无法加入wang wu
        //如果7秒后依旧不能插入元素,返回false
        queue.offer("wang wu",7, TimeUnit.SECONDS);

        //子线程休眠五秒之后,会移除zhang san,再过两秒,可以将wang wu插入队列
        //[li si, wang wu]
        System.out.println(queue);
    }
}

class MyThread extends Thread{
    //成员变量
    ArrayBlockingQueue<String> queue;

    //构造器
    public MyThread(ArrayBlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run(){
        //重写run方法
        //子线程休眠五秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        queue.poll();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MFC】工具条(16)

创建工具条的基本步骤是&#xff1a; 1.创建工具条资源。 2.构建一个CToolBar对象。 3.调用CToolBar::Create函数创建工具条窗口。 4.调用CToolBar::LoadToolBar载入工具条资源。 使用工具条 打开资源视图&#xff0c;可视化创建或者修改工具条&#xff1a; 其中ID项一般与菜…

【计组】硬盘--《深入浅出计算机组成原理》(十二)

目录 一、机械硬盘 二、SSD硬盘 &#xff08;一&#xff09;SSD硬盘的读写原理 1、SLC、MLC、TLC 和 QLC 2、P/E 擦写问题 &#xff08;二&#xff09;SSD 读写的生命周期 &#xff08;三&#xff09;磨损均衡、TRIM 和写入放大效应 1、FTL 和磨损均衡 2、TRIM 指令的…

vueday01-脚手架安装详细

一、vue脚手架安装命令npm i -g vue/cli 或 yarn global add vue/cli安装上面的工具&#xff0c;安装后运行 vue --version &#xff0c;如果看到版本号&#xff0c;说明安装成功或 vue -V工具安装好之后&#xff0c;就可以安装带有webpack配置的vue项目了。创建项目之前&#…

用队列实现栈VS用栈实现队列

之前我们就讲过队列&#xff0c;栈的基础知识&#xff0c;笔者之前有过详细的介绍&#xff0c;感兴趣的可以根据笔者的个人主页进行查找&#xff1a;https://blog.csdn.net/weixin_64308540/?typelately225. 用队列实现栈请你仅使用两个队列实现一个后入先出&#xff08;LIFO&…

加入bing体验chatGPT大军中来吧,它来了!

1 第一步&#xff1a;加入候选名单 1、首先需要加入候选名单 https://www.microsoft.com/zh-cn/edge?formMA13FJ 2、下载最新的Edge浏览器、androd、iOS都有试用版本&#xff08;可以看到iOS加护当前已满&#xff09; 这里我下载的是dev版本&#xff0c;Canary版本由于是…

50. Pow(x, n)

50. Pow(x, n) 一、题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#xff1a;x 2…

决策树分类算法(一)(信息熵,信息增益,基尼指数计算)

目录一、信息量二、信息熵三、信息增益四、基尼指数五、代码&#xff1a;信息熵&#xff0c;信息增益&#xff0c;基尼指数计算&#xff08;splitInfo.py&#xff09;例子&#xff1a; 一、信息量 : I(x)log⁡21p−log⁡2pI(x)\log_{2}{\frac{1}{p}}-\log_{2}{p}I(x)log2​p1…

傻白探索Chiplet,Modular Routing Design for Chiplet-based Systems(十一)

阅读了Modular Routing Design for Chiplet-based Systems这篇论文&#xff0c;是关于多chiplet通信的&#xff0c;个人感觉核心贡献在于实现了 deadlock-freedom in multi-chiplet system&#xff0c;而不仅仅是考虑单个intra-chiplet的局部NoC可以通信&#xff0c;具体的一些…

如何判断两架飞机在汇聚飞行?(如何计算两架飞机的航向夹角?)内含程序源码

ok&#xff0c;在开始一切之前&#xff0c;让我先猜一猜&#xff0c;你是不是想百度“二维平面下如何计算两个移动物体的航向夹角&#xff1f;”如果是&#xff0c;那就请继续往下看。 首先&#xff0c;我们要明确一个概念&#xff1a;航向角≠航向夹角&#xff01;&#xff0…

微信小程序图书馆座位预约管理系统

开发工具&#xff1a;IDEA、微信小程序服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7前端技术&#xff1a;vue、uniapp服务端技术&#xff1a;springbootmybatis本系统分微信小程序和管理后台两部分&#xff0c;项目采用…

家政服务小程序实战教程05-集成腾讯地图

我们在用户注册数据源部分设计了一个地图字段&#xff0c;地图字段在生成页面的时候对应着地图定位组件 要调用地图定位组件&#xff0c;需要先创建API&#xff0c;点击新建API 选择腾讯地图 创建API的时候需要输入API key 进入到腾讯位置服务里申请Key 首先需要创建一个应用 创…

Go 全栈博客实战项目 gin-vue-blog

Go 全栈博客 gin-vue-blog写在前面博客介绍在线预览项目介绍技术介绍目录结构环境介绍线上环境开发环境VsCode 插件快速开始拉取项目前的准备 (Windows)方式一&#xff1a;Docker Compose 一键运行方式二&#xff1a;常规运行项目部署总结鸣谢后续计划写在前面 这个项目其实已经…

Dubbo和Zookeeper集成

分布式理论 什么是分布式系统&#xff1f; 在《分布式系统原理与范型》一书中有如下定义&#xff1a;“分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统”&#xff1b; 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调…

分享111个助理类简历模板,总有一款适合您

分享111个助理类简历模板&#xff0c;总有一款适合您 111个助理类简历模板下载链接&#xff1a;https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码&#xff1a;8y54 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…

浅析SCSI协议(1)基本介绍

概述 SCSI即小型计算机接口&#xff08;Small Computer System Interface&#xff09;&#xff0c;指的是一个庞大协议体系&#xff0c;到目前为止经历了SCSI-1/SCSI-2/SCSI-3变迁。SCSI协议定义了一套不同设备&#xff08;磁盘、磁带、处理器、光设备、网络设备等&#xff09…

C/C++工业数据分析与文件信息管理系统[2023-02-12]

C/C工业数据分析与文件信息管理系统[2023-02-12] 程序设计基础A课程设计 工业数据分析与文件信息管理系统 题目背景 智能制造是以工业生产数据分析、自动化技术为基础&#xff0c;具有信息深度自感知、智慧优化自决策、精准控制自执行等功能&#xff0c;使制造活动达到安全…

[golang gin框架] 2.Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务

一.Gin HTML 模板渲染全部模板放在一个目录里面的配置方法首先在项目根目录新建 templates 文件夹&#xff0c;然后在文件夹中新建 对应的index.html<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http…

图像处理-边缘检测-文献阅读笔记

[1]李华琛. 基于opencv图像边缘检测技术[J]. 数字技术与应用, 2016(11):2. 高斯滤波有效抑制噪声&#xff1b;原理&#xff1a;识别图像中亮度改变较为明显的点&#xff0c;本质是采用不同的算子进行边缘检测并进行修整。算子&#xff1a;Laplacian 算子、Scharr 算子、Canny 算…

Kerberos简单介绍及使用

Kerberos作用 简单来说安全相关一般涉及以下方面&#xff1a;用户认证&#xff08;Kerberos的作用&#xff09;、用户授权、用户管理.。而Kerberos功能是用户认证&#xff0c;通俗来说解决了证明A是A 的问题。 认证过程&#xff08;时序图&#xff09; 核心角色/概念 KDC&…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题(共15题&#xff0c;共30分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共3题&#xff0c;共50分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;四级&#xff09; 一、单选题(共15题&#xff0c;共30分) 1. 运行下列程序…