Java基础 - 13 Queue之DelayQueue、PriorityQueue、PriorityBlockingQueue讲解

在Java的队列世界里,有三位大佬,他们分别是DelayQueue、PriorityQueue和PriorityBlockingQueue。今天,让我们一起揭开他们神秘的面纱,看看他们各自的特点和用途吧!

DelayQueue

在这里插入图片描述

首先,让我们来认识一下DelayQueue。这位大佬有点“慢热”,因为他专门负责处理延迟任务。你可以把他想象成一个“倒计时专家”,只有在指定的延迟时间过后,任务才能被取出来。这在一些需要延迟执行的场景中非常有用,比如定时任务调度、缓存失效等。要使用DelayQueue,你需要实现Delayed接口,并重写getDelay()和compareTo()方法,让任务按照你的设定来执行。

在这里插入图片描述

DelayQueue 是 Java 中的一个并发工具类,用于存储实现了 Delayed 接口的元素,并且这些元素会在一定时间之后才能被获取。常用于实现定时任务调度、消息延迟处理等场景。

在 DelayQueue 中,常用的方法包括:

put(E e):将指定元素放入队列中。
take():获取并移除队列的头部元素,如果队列为空,则阻塞等待。
poll():获取并移除队列的头部元素,如果队列为空,则返回 null。
offer(E e):将指定元素插入队列中,如果成功则返回 true,否则返回 false。

下面是一个简单的示例代码,演示了如何使用 DelayQueue:

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;class DelayedElement implements Delayed {private String data;private long delayTime;public DelayedElement(String data, long delayTime) {this.data = data;this.delayTime = System.currentTimeMillis() + delayTime;}@Overridepublic long getDelay(TimeUnit unit) {long diff = delayTime - System.currentTimeMillis();return unit.convert(diff, TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed o) {return Long.compare(this.delayTime, ((DelayedElement) o).delayTime);}@Overridepublic String toString() {return data;}
}public class Main {public static void main(String[] args) throws InterruptedException {DelayQueue<DelayedElement> delayQueue = new DelayQueue<>();delayQueue.put(new DelayedElement("Element 1", 2000));delayQueue.put(new DelayedElement("Element 2", 5000));System.out.println("Elements added to queue");System.out.println(delayQueue.take());System.out.println(delayQueue.take());}
}

PriorityQueue

接下来,让我们迎接PriorityQueue,这位大佬可是“优先级之王”!他会根据元素的优先级来决定谁先出场,谁后登场。如果你有一堆任务,但又想要按照优先级来处理它们,PriorityQueue就是你的不二选择。你可以通过实现Comparable接口或者在构造函数中传入Comparator来定义元素的优先级顺序。这位大佬可是个“绅士”,总是把优先级最高的任务放在队列的最前面。

在这里插入图片描述

PriorityQueue 的特点和常用方法包括:

  • 默认情况下是一个小顶堆,也可以通过自定义 Comparator 来实现大顶堆。
  • 元素根据其自然顺序或者 Comparator 排序。
  • 插入操作和删除操作的时间复杂度为 O(log n)。
  • 不支持 null 元素。

常用方法包括:

  • add(E e) / offer(E e):将元素插入队列。
  • remove() / poll():获取并移除队列的头部元素。
  • peek():获取但不移除队列的头部元素。
  • size():返回队列的大小。

其他方法:
在这里插入图片描述
案例:

import java.util.PriorityQueue;public class Main {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(3);priorityQueue.offer(1);priorityQueue.offer(2);System.out.println("Elements in priority queue:");while (!priorityQueue.isEmpty()) {System.out.println(priorityQueue.poll());}}
}

在这里插入图片描述

PriorityBlockingQueue

最后,让我们见识一下PriorityBlockingQueue,他是PriorityQueue的“大哥”,更加强大且安全。和PriorityQueue一样,他也是按照优先级来排序任务,但是在多线程环境下,PriorityBlockingQueue更加稳定可靠。他内部使用了可重入锁来保证线程安全,让你在多线程场景下也能够放心使用。如果你需要在多线程环境下处理优先级任务,PriorityBlockingQueue会是你的得力助手。
在这里插入图片描述

PriorityBlockingQueue 的特点和常用方法类似于 PriorityQueue,但是它是一个阻塞队列,支持生产者-消费者模型,具有以下特点:

  • 是一个无界队列,可以存储任意数量的元素。
  • 内部使用 ReentrantLock 来保证线程安全。
  • 支持自定义 Comparator 来定义元素的优先级。

常用方法包括:

  • put(E e):将元素插入队列,如果队列已满则阻塞等待。
  • take():获取并移除队列的头部元素,如果队列为空则阻塞等待。
  • offer(E e):将元素插入队列,如果成功则返回 true,否则返回 false。
  • poll():获取并移除队列的头部元素,如果队列为空则返回 null。

其他方法:
在这里插入图片描述

案例:

import java.util.concurrent.PriorityBlockingQueue;public class Main {public static void main(String[] args) throws InterruptedException {PriorityBlockingQueue<Integer> priorityBlockingQueue = new PriorityBlockingQueue<>();priorityBlockingQueue.put(3);priorityBlockingQueue.put(1);priorityBlockingQueue.put(2);System.out.println("Elements in priority blocking queue:");while (!priorityBlockingQueue.isEmpty()) {System.out.println(priorityBlockingQueue.take());}}
}

无论是“倒计时专家”DelayQueue、“优先级之王”PriorityQueue,还是“大哥”PriorityBlockingQueue,它们都各司其职,在Java队列的世界里发挥着重要作用。

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

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

相关文章

2.22 作业

顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…

工厂方法模式Factory Method

1.模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类 2.使用场景 1.当你不知道改使用对象的确切类型的时候 2.当你希望为库或框架提供扩展其内部组件的方法时 主要优点&#xff1a; 1.将具体产品和创建…

PHP+vue+mysql仓库进销存管理系统8jeqj

开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等 数据库工具&#xff1a;Navicat/phpmyadmin 登录模块&#xff1a;此模块主要有4个部分&#xff0c;基…

实验中用户行为的检测

[1] Makris S , Karagiannis P , Koukas S ,et al.Augmented reality system for operator support in human–robot collaborative assembly[J].CIRP Annals - Manufacturing Technology, 2016:S0007850616300385.DOI:10.1016/j.cirp.2016.04.038. —————————————…

什么是SSD型云服务器?

​  SSD云服务器是一种使用固态硬盘代替传统HDD进行存储的虚拟机。SDD 使用闪存单元来存储数据&#xff0c;与云计算技术相结合&#xff0c;形成强大且高效的存储解决方案&#xff0c;可以随时随地访问。 SSD云服务器如何工作? SSD云服务器是利用虚拟化和云计算技术创建的。…

C++最佳实践之编译篇

C最佳实践之工程编译 在大型c/c工程开发中&#xff0c;往往会涉及多级CMakeLists.txt的调用&#xff0c;并且调用方式错综复杂&#xff0c;主要有以下两种方式&#xff1a; 1. 子目录中的CMakeList.txt独立生成目标&#xff0c;不作为主目标生成过程的依赖关系&#xff08;比…

virtualenv env_name 使用 virtualenv 创建 python 虚拟环境

为什么要用这个 win7 32 环境下 pycharm 只能用低版本的&#xff0c;比如 2016,2018 此时pycharm 图形界面创建的 虚拟环境版本很低&#xff0c;有些包不兼容&#xff0c;因此用 virtualenv 模块&#xff0c;可以创建 20 版本以上的虚拟环境 virtualenv env_name官方文档 http…

如何选择最适合的图纸加密软件?安秉网盾软件用户体验及性价比

安秉网盾图纸加密软件是一款功能强大的图纸加密工具&#xff0c;具有以下特点和优势&#xff1a; 全盘加密&#xff1a;安秉网盾采用先进的加密算法&#xff0c;能对文件、文件夹、磁盘等数据进行全面加密&#xff0c;确保数据在存储和传输过程中的安全性。 监控与审计&#x…

关于el-select值的回显问题 : 框内显示label值还是value值

<el-form-item label"状态" prop""><el-selectv-model"roleForm.state"class"m-2"size"large"style"width: 240px"placeholder"请选择状态"value-key"value"//value-key 与下面的ke…

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x Projectpom.xmlOpenAPIConfigFileUploadControllerapplication.yaml Project pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

软件压力测试:测试方法与步骤详解

随着软件应用的不断发展&#xff0c;用户对系统性能的要求也逐渐提高。在不同的负载条件下&#xff0c;系统必须能够保持稳定、高效的运行。软件压力测试是一种验证系统在各种负载情况下性能表现的关键手段。本文将详细探讨软件压力测试的方法和步骤。 1. 明确测试目标 在进行压…

vue源码分析之nextTick源码分析-逐行逐析-错误分析

nextTick的使用背景 在vue项目中&#xff0c;经常会使用到nextTick这个api&#xff0c;一直在猜想其是怎么实现的&#xff0c;今天有幸研读了下&#xff0c;虽然源码又些许问题&#xff0c;但仍值得借鉴 核心源码解析 判断当前环境使用最合适的API并保存函数 promise 判断…

2024年2月17日~2月23日周报

文章目录 一、前言二、DDNet架构学习2.1 数据预处理2.2 网络模型构建 三、基于深度学习地震数据去噪处理3.1 深度学习在地震数据去噪中的研究方向3.2 深度学习地震数据去噪流程3.2.1 数据集准备3.2.2 模型构建3.2.3 训练网络 3.3 基于DnCNN的地震数据去噪实验 四、小结4.1 存在…

Javascript数字精度丢失的问题

一、问题 0.1 0.2 0.3 // false 二、浮点数 “浮点数”是一种表示数字的标准&#xff0c;整数也可以用浮点数的格式来存储 我们也可以理解成&#xff0c;浮点数就是小数 在JavaScript中&#xff0c;现在主流的数值类型是Number&#xff0c;而Number采用的是IEEE754规范中…

uniapp开发微信小程序跳转到另一个小程序中

注意&#xff1a;一开始我的云上务工模块是单独的tabbar界面&#xff0c;但是小程序跳转好像不能直接点击tabbar进行&#xff0c;所以我将这里改成了点击首页中的按钮进行跳转 点击这里进行小程序跳转 目录 基础讲解 uniapp小程序跳转的两个方法 调用说明&#xff08;半屏跳转…

C++力扣题目 647--回文子串 516--最长回文子序列

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…

面试系列之《Spark》(持续更新...)

参考文档及示例代码均基于pyspark3.1.2 1.什么是RDD&#xff1f;2.job、stage、task如何划分&#xff1f;3.什么是宽窄依赖&#xff1f;4.spark有哪几种部署模式&#xff1f;5.spark中的算子分为哪些类型&#xff0c;举例说明。6.cache、persist、checkpoint的区别&#xff0c;…

C++模板为什么不能声明和定义分离

首先我们要直到C程序运行需要进行的四个阶段。 预处理->编译->汇编->链接 编译&#xff1a;对语法语义分析&#xff0c;分析无误生成汇编&#xff0c;头文件不参加编译&#xff0c;多个源文件是分开单独编译的。 链接&#xff1a;将多个obj文件链接合成一个&#x…

Sora----打破虚实之间的最后一根枷锁----这扇门的背后是人类文明的晟阳还是最后的余晖

目录 一.Sora出道即巅峰 二.为何说Sora是该领域的巨头 三.Sora无敌的背后究竟有怎样先进的处理技术 1.Spacetime Latent Patches 潜变量时空碎片&#xff0c;建构视觉语言系统 2.扩散模型与Diffusion Transformer&#xff0c;组合成强大的信息提取器 3.DiT应用于潜变量时…

关于在分布式环境中RVN和使用场景的介绍4

简介 在前面的文档中&#xff0c;我们介绍了RVN的概念&#xff0c;通过RVN可以解决的某类问题和使用技巧&#xff0c;以及处理RVN的逻辑的具体实现。在本文中&#xff0c;我们将要介绍关于如何使用RVN解决另一种在分布式系统中常出现的问题。 问题 假设我们创建了一个servic…