Java中常用的七种队列你了解多少?

news/2024/4/25 22:33:16/文章来源:https://blog.csdn.net/qq_44866828/article/details/129255665

文章目录

    • Java中常用的七种队列你了解多少?
    • ArrayBlockingQueue队列如何使用?
      • 添加元素到队列
      • 获取队列中的元素
      • 遍历队列
    • LinkedBlockingQueue队列如何使用?
      • 1. 创建SynchronousQueue对象
      • 2. 添加元素到队列
      • 3. 获取队列中的元素
      • 4. 遍历队列
    • SynchronousQueue队列如何使用?
      • 创建SynchronousQueue对象
      • 添加元素到队列
      • 获取队列中的元素
      • 遍历队列
    • LinkedTransferQueue队列如何使用?
      • 1. 创建LinkedTransferQueue对象
      • 2. 添加元素到队列
      • 3. 获取队列中的元素
      • 4. 遍历队列
    • ConcurrentLinkedQueue队列如何使用?
      • 1. 创建DelayQueue对象
      • 2. 添加元素到DelayQueue
      • 3. 获取DelayQueue中的元素
      • 4. 自定义元素类
    • DelayQueue队列如何使用?
      • 创建DelayQueue对象
      • 添加元素到DelayQueue
      • 获取DelayQueue中的元素
    • 总结:
  • 结语

Java中常用的七种队列你了解多少?

Java中常用的队列有以下几种:

  1. ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,按照先进先出的原则对元素进行排序。
  2. LinkedBlockingQueue:一个基于链表结构的有界阻塞队列,按照先进先出的原则对元素进行排序。
  3. PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
  4. DelayQueue:一个支持延时获取元素的无界阻塞队列。
  5. SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,否则插入操作一直处于阻塞状态。
  6. LinkedTransferQueue:一个基于链表结构的无界阻塞队列,支持生产者消费者模式。
  7. ConcurrentLinkedQueue:一个基于链表结构的无界并发队列,按照先进先出的原则对元素进行排序。

这些队列都实现了Queue接口或其子接口,可以根据不同的场景和需求选择合适的队列。在并发场景下,应当注意队列的线程安全性以及对并发操作的支持程度。

ArrayBlockingQueue队列如何使用?

ArrayBlockingQueue是Java中的一个线程安全的队列,它是一种基于数组实现的有界队列。下面介绍一下ArrayBlockingQueue队列的使用方法。

创建ArrayBlockingQueue对象
可以使用new关键字创建ArrayBlockingQueue对象。

ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(capacity);

其中,capacity参数表示队列的容量。

添加元素到队列

可以使用add方法向队列中添加元素,如果队列已满,则会抛出IllegalStateException异常。

queue.add("wx:libin9iOak");  

也可以使用offer方法向队列中添加元素,如果队列已满,则返回false。

boolean result = queue.offer("wx:libin9iOak");

还可以使用put方法向队列中添加元素,如果队列已满,则当前线程会被阻塞,直到有其他线程从队列中删除元素。

queue.put("wx:libin9iOak");

获取队列中的元素

可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有其他线程向队列中添加元素。

String element = queue.take();

也可以使用poll方法获取队列中的元素,如果队列为空,则返回null。

String element = queue.poll();

还可以使用poll方法设置超时时间,如果在指定的时间内没有获取到元素,则返回null。

String element = queue.poll(timeout, unit);

遍历队列

可以使用迭代器遍历队列中的元素。

Iterator<String> iterator = queue.iterator();
while(iterator.hasNext()) {String element = iterator.next();// do something with the element
}

也可以使用for-each循环遍历队列中的元素。

for(String element : queue) {// do something with the element
}

ArrayBlockingQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。同时,由于它是一种有界队列,因此在使用时需要注意队列的容量,以免发生队列溢出。

LinkedBlockingQueue队列如何使用?

SynchronousQueue是Java中的一个线程安全的队列,它是一种没有缓冲的队列,其中每个插入操作必须等待另一个线程的删除操作,反之亦然。下面介绍一下SynchronousQueue队列的使用方法。

1. 创建SynchronousQueue对象

可以使用new关键字创建SynchronousQueue对象。

 
SynchronousQueue<String> queue = new SynchronousQueue<>();

2. 添加元素到队列

SynchronousQueue是一种没有缓冲的队列,因此不能直接将元素添加到队列中。它的插入操作必须等待另一个线程的删除操作。可以使用put方法向队列中添加元素,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。

 
queue.put("wx:libin9iOak");

3. 获取队列中的元素

可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。

 
String element = queue.take();

4. 遍历队列

SynchronousQueue是一种没有缓冲的队列,因此不支持遍历操作。

SynchronousQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。但是需要注意的是,由于它是一种没有缓冲的队列,因此在使用时需要确保生产者线程和消费者线程之间的数量平衡,否则可能会导致线程阻塞或队列溢出。

Regenerate response

SynchronousQueue队列如何使用?

SynchronousQueue是Java中的一个线程安全的队列,它是一种没有缓冲的队列,其中每个插入操作必须等待另一个线程的删除操作,反之亦然。下面介绍一下SynchronousQueue队列的使用方法。

创建SynchronousQueue对象

可以使用new关键字创建SynchronousQueue对象。

 ```

SynchronousQueue queue = new SynchronousQueue<>();
```

添加元素到队列

SynchronousQueue是一种没有缓冲的队列,因此不能直接将元素添加到队列中。它的插入操作必须等待另一个线程的删除操作。可以使用put方法向队列中添加元素,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。

 ```

queue.put(“wx:libin9iOak”);
```

获取队列中的元素

可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。

 ```

String element = queue.take();
```

遍历队列

SynchronousQueue是一种没有缓冲的队列,因此不支持遍历操作。

SynchronousQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。但是需要注意的是,由于它是一种没有缓冲的队列,因此在使用时需要确保生产者线程和消费者线程之间的数量平衡,否则可能会导致线程阻塞或队列溢出。

LinkedTransferQueue队列如何使用?

LinkedTransferQueue是Java中的一个线程安全的队列,它是基于链表实现的无界队列,支持高效的并发访问。相比于ConcurrentLinkedQueue,它多了一种阻塞等待的机制。下面介绍一下LinkedTransferQueue队列的使用方法。

1. 创建LinkedTransferQueue对象

可以使用new关键字创建LinkedTransferQueue对象。

          
LinkedTransferQueue<String> queue = new LinkedTransferQueue<>();

2. 添加元素到队列

可以使用add、offer或transfer方法将元素添加到队列中。

  queue.add("wx:libin9iOak");
queue.offer("weix:libin9iOak");
queue.transfer("element3");

其中,add方法在队列已满时会抛出异常,而offer方法则会返回false。而transfer方法则是一种阻塞等待的机制,它会将元素立即转移给等待的消费者线程,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。

3. 获取队列中的元素

可以使用poll方法获取队列中的元素,如果队列为空,则返回null。

          
String element = queue.poll();

也可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。

          
String element = queue.take();

4. 遍历队列

可以使用forEach方法遍历队列中的元素。

          
queue.forEach(System.out::println);

也可以使用迭代器遍历队列中的元素。

          Iterator<String> iterator = queue.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}

LinkedTransferQueue支持高效的并发访问,并且它提供了一种阻塞等待的机制,可以更加灵活地控制线程之间的交互。但是需要注意的是,由于它是基于链表实现的,因此在进行遍历或删除操作时,需要注意多线程并发修改的问题。

ConcurrentLinkedQueue队列如何使用?

DelayQueue是Java中的一个阻塞队列,它可以支持延时获取元素的功能。在DelayQueue中,每个元素都有一个过期时间,只有当元素的过期时间到了才能被获取,否则元素一直处于阻塞状态。下面介绍一下DelayQueue队列的使用方法。

1. 创建DelayQueue对象

可以使用new关键字或者工具类Executors创建DelayQueue对象。

     
DelayQueue<MyDelayedElement> delayQueue = new DelayQueue<>();

其中MyDelayedElement是自定义的实现了Delayed接口的元素类,实现getDelay方法用于返回元素的过期时间。

2. 添加元素到DelayQueue

可以使用add或offer方法将元素添加到DelayQueue中。

     delayQueue.add(new MyDelayedElement("wx:libin9iOak", 1000));
delayQueue.offer(new MyDelayedElement("weix:libin9iOak", 2000));

其中,第二个参数是元素的过期时间,单位为毫秒。

3. 获取DelayQueue中的元素

可以使用take方法获取DelayQueue中的元素,如果没有可用的元素,则线程会一直处于阻塞状态。

     
MyDelayedElement element = delayQueue.take();

也可以使用poll方法获取DelayQueue中的元素,如果没有可用的元素,则返回null。

     
MyDelayedElement element = delayQueue.poll();

4. 自定义元素类

MyDelayedElement是一个自定义的实现了Delayed接口的元素类,下面是一个简单的示例代码。

     public class MyDelayedElement implements Delayed {private String name; // 元素名称private long expireTime; // 过期时间public MyDelayedElement(String name, long delay) {this.name = name;this.expireTime = System.currentTimeMillis() + delay;}// 获取元素的过期时间@Overridepublic long getDelay(TimeUnit unit) {long diff = expireTime - System.currentTimeMillis();return unit.convert(diff, TimeUnit.MILLISECONDS);}// 按照过期时间排序@Overridepublic int compareTo(Delayed other) {long diff = this.getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS);return Long.compare(diff, 0);}// 元素业务逻辑public void doBusiness() {System.out.println("Element " + name + " has expired");}
}

在上面的示例代码中,元素的过期时间是由创建元素时指定的delay参数和当前时间计算得出的。在getDelay方法中,返回元素的过期时间与指定时间单位的差值,这个差值会用于元素的排序。在compareTo方法中,按照过期时间从小到大排序。在doBusiness方法中,执行元素的业务逻辑。

总之,DelayQueue可以用于实现一些延时操作,例如定时任务调度、缓存失效等。在使用时,需要注意元素的过期时间和业务逻辑的处理。

DelayQueue队列如何使用?

DelayQueue是Java中的一个阻塞队列,它可以支持延时获取元素的功能。在DelayQueue中,每个元素都有一个过期时间,只有当元素的过期时间到了才能被获取,否则元素一直处于阻塞状态。下面介绍一下DelayQueue队列的使用方法。

创建DelayQueue对象

可以使用new关键字或者工具类Executors创建DelayQueue对象。

DelayQueue<MyDelayedElement> delayQueue = new DelayQueue<>();

其中MyDelayedElement是自定义的实现了Delayed接口的元素类,实现getDelay方法用于返回元素的过期时间。

添加元素到DelayQueue

可以使用add或offer方法将元素添加到DelayQueue中。

delayQueue.add(new MyDelayedElement("wx:libin9iOak", 1000));
delayQueue.offer(new MyDelayedElement("weix:libin9iOak", 2000));

其中,第二个参数是元素的过期时间,单位为毫秒。

获取DelayQueue中的元素

可以使用take方法获取DelayQueue中的元素,如果没有可用的元素,则线程会一直处于阻塞状态。

MyDelayedElement element = delayQueue.take();

也可以使用poll方法获取DelayQueue中的元素,如果没有可用的元素,则返回null。

MyDelayedElement element = delayQueue.poll();

自定义元素类
MyDelayedElement是一个自定义的实现了Delayed接口的元素类,下面是一个简单的示例代码。


public class MyDelayedElement implements Delayed {private String name; // 元素名称private long expireTime; // 过期时间public MyDelayedElement(String name, long delay) {this.name = name;this.expireTime = System.currentTimeMillis() + delay;}// 获取元素的过期时间@Overridepublic long getDelay(TimeUnit unit) {long diff = expireTime - System.currentTimeMillis();return unit.convert(diff, TimeUnit.MILLISECONDS);}// 按照过期时间排序@Overridepublic int compareTo(Delayed other) {long diff = this.getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS);return Long.compare(diff, 0);}// 元素业务逻辑public void doBusiness() {System.out.println("Element " + name + " has expired");}}

在上面的示例代码中,元素的过期时间是由创建元素时指定的delay参数和当前时间计算得出的。在getDelay方法中,返回元素的过期时间与指定时间单位的差值,这个差值会用于元素的排序。在compareTo方法中,按照过期时间从小到大排序。在doBusiness方法中,执行元素的业务逻辑。

总之,DelayQueue可以用于实现一些延时操作,例如定时任务调度、缓存失效等。在使用时,需要注意元素的过期时间和业务逻辑的处理。

总结:

ArrayBlockingQueue是一种有界队列,它可以设定最大容量,当队列满时,新增元素会被阻塞;LinkedBlockingQueue是一种无界队列,它将新增元素放在队列的尾部,获取元素时从队列的头部开始获取;PriorityBlockingQueue是一种带有优先级的队列,它会根据元素的优先级顺序来进行排序;LinkedTransferQueue是一种基于链表实现的无界队列,它支持高效的并发访问,并且它提供了一种阻塞等待的机制;

ConcurrentLinkedQueue是一种基于链接节点的无界线程安全队列,支持高性能的并发操作。

在这里插入图片描述

结语

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我要测网2022优秀检测机构评选活动举办,径硕科技分享数字营销趋势

2023年2月17号&#xff0c;由我要测网主办的「数字营销韧性增长&#xff5c;2023TIC营销人开年报告」圆满举办。来自南京市产品质量监督检验院、中国检科院测试评价中心、径硕科技JINGdigital等企业的3位“重量级”嘉宾进行了精彩纷呈的分享&#xff0c;为在低谷中前行的检测机…

我嘞个神——原来创建应用根本不需要会编码(看我10分钟应用上线)

目录 一、前言 二、官网功能查询与环境初始化 YonBuilder应用开发 三、测试过程 3.1、创建应用 3.2、数据建模 3.3、页面建模 3.4、页面发布 四、时间累计 五、效率评价 六、总结 一、前言 这里我用到了用友的平台&#xff0c;很多学生们刚毕业都在从事运维和实施的…

Java基础:常见API(Math,System,Runtime,Object,BigInteger,BigDecima)

1.常见API 1.1 Math类 向上取整是向着数轴右边走的意思, 负数也是. 也可以叫进一法, 不论正数负数都会往右走一. 向下取整是向着数轴左边走. 也可以叫去尾法, 不论正负数都会将小数点后的数字去掉. 1.1.2 练习 // 判断有多少水仙花数int count 0;for (int i 100; i < 1…

如何在没有任何额外包的情况下使用 NodeJS 下载文件

如何在没有任何额外包的情况下使用 NodeJS 下载文件 您可以下载文件&#xff08;图像、文本或任何类型的文件&#xff09;并使用 NodeJS 内置 https和 fs模块将其保存到您的文件系统。 该 https模块允许您使用 NodeJS 创建 HTTPS 请求&#xff0c;同时该 fs模块授予您访问文件…

【论文精读11】MVSNet系列(2018-2022)总结

MVSNet系列总结1.MVSNet ECCV20182.RMVSNet CVPR20193.P-MVSNet ICCV20194.MVSCRF ICCV20195.PointMVSNet ICCV20192019年的这四篇文章各有特点&#xff0c;其中RMVSNet、PointMVSNet更是打开了可以继续沿着往下做的思路&#xff1a;6.cascade MVSNet CVPR20207.UCSNet CVPR202…

Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

Python基础—while循环

(1)while循环&#xff1a; 语法格式&#xff1a; while 条件&#xff1a;   执行语句1……   执行语句2…… 适用条件&#xff1a;无限循环 死循环 while True:print(条件是真的&#xff01;)代码实例&#xff1a; i 0 # 创建一个计数的变量 while i < 5: # Truepr…

一个容易被忽视的标签 —— iframe

前言 甲问&#xff1a;说说你知道的HTML标签。 乙于是说了一大堆标签&#xff0c;比如div&#xff0c;span等等。 甲说&#xff1a;那你知道 iframe 标签吗&#xff1f; 乙这时候迟疑了片刻&#xff0c;缓缓说出&#xff1a;知道它&#xff0c;但是不太了解这个标签。 HTM…

Linux文件属性--软连接和硬链接

文章目录软链接硬链接软链接和硬链接的区别软链接 软链接&#xff08;Soft Link&#xff09;又叫符号链接&#xff08;Symbolic Link &#xff09;&#xff0c;是linux特殊文件的一种&#xff0c;文件类型为l,它的数据是它所链接的文件或目录的路径。软链接可以跨磁盘和 分区…

动手学深度学习(第二版)学习笔记 第三章

第三章 线性神经网络 代码&#xff1a;d2l-zh/pytorch/chapter_linear-networks 3.1 线性回归 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation 解析解 线性回归的解可以用一个公式简单地表达出来&#xff0c;这类解叫作解析解&#xff08;analytical solution&…

git在工作中的正常使用

开发A和B功能后进行发版。。 一、拉取代码 git clone http://ntc.ntsvars.com:8090/lvweijie/test.git二、开发功能A任务 创建A任务本地分支 #创建A分支&#xff0c;并切换A分支 git checkout -b A三、开发A任务 四、提交A功能文件到本地分支 git add .五、添加提交A功能备…

AcWing3485. 最大异或和

先看题目&#xff1a; 说实话&#xff0c;我看到这道题就想用滑动窗口&#xff0c;但是滑了一下发现不太对啊&#xff0c;如果我用滑动窗口的话&#xff0c;那么最后肯定是一个固定长度为m的窗口在持续计算&#xff0c;区间长度小于m的区间的异或和肯定会被遗漏。然后我就想怎么…

FSP:Flow of Solution Procedure (CVPR 2017) 原理与代码解析

paper&#xff1a;A Gift From Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learningcode&#xff1a;https://github.com/HobbitLong/RepDistiller/blob/master/distiller_zoo/FSP.py背景深度神经网络DNN逐层生成特征。更高层的特征更接近…

决策树在sklearn中的实现

目录 一.模块sklearn.tree 二.建模基本流程 三.DecisionTreeClassifier重要参数 1.criterion 2.random_state & splitter 3.剪枝参数max_depth 4.剪枝参数min_samples_leaf & min_samples_split 5.max_features & min_impurity_decrease 6.class_weight …

Python IDE:对于 Python 初学者来说,最好的 IDE 是什么?

Python 是科技界最简单、使用最广泛的编程语言之一。它是一种高级通用编程语言&#xff0c;强调代码可读性并使用面向对象的方法。Python可以用来完成很多任务&#xff0c;包括网站开发、软件开发、 自动化 和数据分析 专业开发人员使用Python开发各种流行的软件程序&#xff0…

深入理解Spring MVC上

Spring MVC 是一种基于 Spring 框架的 Web 框架&#xff0c;它提供了一种基于 Model-View-Controller&#xff08;MVC&#xff09;的设计模式&#xff0c;用于构建 Web 应用程序。在 Spring MVC 中&#xff0c;Controller 接受并处理 HTTP 请求&#xff0c;并将其转发给适当的 …

多表left join 慢sql问题

作为个人记录&#xff0c;后续再填坑a对p是1对多 ,p对llup 1对多SELECTa.id,p.id,t1.id FROMliv_series_product aINNER JOIN liv_product p ON p.id a.product_idLEFT JOIN ( SELECT llup.id, llup.product_id, llup.room_id FROM liv_live_user_product llup WHERE llup.ro…

Tomcat部署及多实例

Tomcat部署及多实例一、Tomcat简介1、Tomcat核心组件2、什么是JSP二、Tomcat数据流向1、Tomcat数据流向2、Tomcat-Nginx数据流向三、Tomcat服务部署安装1、安装jdk包2、解压Tomcat所需的安装包3、在/etc/profile添加环境变量4、启动服务并查看5、在浏览器网页验证6、创建用户&a…

为什么硬件性能监控很重要

当今的混合网络环境平衡了分布式网络和现代技术的实施。但它们并不缺少一个核心组件&#xff1a;服务器。保持网络正常运行时间归结为监控和管理导致网络停机的因素。极有可能导致性能异常的此类因素之一是硬件。使用硬件监控器监控网络硬件已成为一项关键需求。 硬件监视器是…

优化知识管理方法丨整理零碎信息,提高数据价值

信息流时代&#xff0c;知识成集合倍数增长&#xff0c;看似我们学习了很多知识&#xff0c;但知识零碎无系统&#xff0c;知识之间缺乏联系&#xff0c;没有深度&#xff0c;所以虽然你很努力&#xff0c;但你发现自己的能力增长特别缓慢&#xff0c;你需要整理知识将零散的知…