我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java线程池队列中的延迟队列DelayQueue怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java线程池队列中的延迟队列DelayQueue怎么使用

今天小编给大家分享一下Java线程池队列中的延迟队列DelayQueue怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

在阻塞队里中,除了对元素进行增加和删除外,我们可以把元素的删除做一个延迟的处理,即使用DelayQueue的方法。本文就来和大家聊聊Java线程池队列中的DelayQueue—延迟队列 

public enum QueueTypeEnum {    ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"),    LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"),    DELAY_QUEUE(3, "DelayQueue"),    PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"),    SYNCHRONOUS_QUEUE(5, "SynchronousQueue"),    LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"),    LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"),    VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"),    MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue");}

DelayQueue延迟队列

类似于PriorityBlockingQueue,是二叉堆实现的无界优先级阻塞队列。要求元素都实现Delayed 接口,通过执行时延从队列中提取任务,只有在延迟期满后才能从中提取元素。DelayQueue的泛型参数需要实现Delayed接口,Delayed接口继承了Comparable接口,DelayQueue内部使用非线程安全的优先队列(PriorityQueue),并使用Leader/Followers模式,最小化不必要的等待时间。DelayQueue不允许包含null元素。

public interface Delayed extends Comparable<Delayed> {        long getDelay(TimeUnit unit);}

DelayQueue使用场景

缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。

定时任务调度:使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,从比如TimerQueue就是使用DelayQueue实现的。

DelayQueue属性

//可重入同步锁private final transient ReentrantLock lock = new ReentrantLock();//DelayQueue的实现依赖于PriorityQueue(优先队列)private final PriorityQueue<E> q = new PriorityQueue<E>();//第一个等待某个延时对象的线程,在延时对象还没有到期时其他线程看到这个leader不为null,那么就直接wait//主要是为了避免大量线程在同一时间点唤醒,导致大量的竞争,反而影响性能private Thread leader = null;//条件队列,用于wait线程private final Condition available = lock.newCondition();

DelayQueue构造方法

//从上面属性就可以看出,DelayQueue采用了饿汉模式,调用构造方法即创建了队列实例public DelayQueue() {}public DelayQueue(Collection<? extends E> c) {    this.addAll(c);}

实现Delayed接口使用示例

class MyDelay<T> implements Delayed {    long delayTime; // 延迟时间    long expire; // 过期时间    T data;    public MyDelay(long delayTime, T t) {        this.delayTime = delayTime;        // 过期时间 = 当前时间 + 延迟时间        this.expire = System.currentTimeMillis() + delayTime;        data = t;    }        @Override    public long getDelay(TimeUnit unit) {        return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);    }        @Override    public int compareTo(Delayed o) {        long f = this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);        return (int) f;    }    @Override    public String toString() {        return "delayTime=" + delayTime +                ", expire=" + expire +                ", data=" + data;    }}public class DelayQueueDemo {    static BlockingQueue<Delayed> queue = new DelayQueue();    public static void main(String[] args) throws InterruptedException {        queue.add(new MyDelay(8, "第一次添加任务"));        queue.add(new MyDelay(3, "第二次添加任务"));        queue.add(new MyDelay(5, "第三次添加任务"));        while (!queue.isEmpty()) {            Delayed delayed = queue.take();            System.out.println(delayed);        }    }}

DelayQueue总结

DelayQueue其实采用了装饰器模式,在对PriorityQueue进行包装下增加了延时时间获取元素的功能,其主要特点归纳如下:

  • DelayQueue是一个无界阻塞队列,队列内部使用PriorityQueue来实现

  • 进入队列的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有在延迟期满时才能从中提取元素

  • 该队列头部是延迟期满后保存时间最长的Delayed元素

  • 如果没有延迟未过期元素,且队列没有头部,并且poll将返回null

  • 当一个元素的getDelay(TimeUnit.NANOSECONDS)方法返回一个小于等于0的值时,表示该元素已过期

  • 无法使用poll或take移除未到期的元素,也不会将这些元素作为正常元素对待;例如:size方法返回到期和未到期元素的计数之和

  • 此队列不允许使用null元素

以上就是“Java线程池队列中的延迟队列DelayQueue怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java线程池队列中的延迟队列DelayQueue怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java线程池队列中的延迟队列DelayQueue怎么使用

今天小编给大家分享一下Java线程池队列中的延迟队列DelayQueue怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧
2023-07-04

详解Java线程池队列中的延迟队列DelayQueue

这篇文章主要为大家详细介绍了Java线程池队列中的延迟队列DelayQueue的相关资料,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2022-12-08

java并发中DelayQueue延迟队列原理的示例分析

这篇文章给大家分享的是有关java并发中DelayQueue延迟队列原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。介绍DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现
2023-06-15

如何在Java中使用延迟队列

本篇文章给大家分享的是有关如何在Java中使用延迟队列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. DelayQueue首先,定义一个延迟任务package com.c
2023-06-14

使用Redis怎么实现延迟队列

本篇文章给大家分享的是有关使用Redis怎么实现延迟队列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方案一:采用通过定时任务采用数据库/非关系型数据库轮询方案。优点:1. 实
2023-06-15

thinkphp6使用think-queue怎么实现普通队列和延迟队列

本文小编为大家详细介绍“thinkphp6使用think-queue怎么实现普通队列和延迟队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“thinkphp6使用think-queue怎么实现普通队列和延迟队列”文章能帮助大家解决疑惑,下
2023-06-30

Java怎么自定义线程池中队列

本篇内容介绍了“Java怎么自定义线程池中队列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景业务交互的过程中涉及到了很多关于SFTP下载
2023-07-02

使用Java无界队列的线程池会怎么样

本篇内容主要讲解“使用Java无界队列的线程池会怎么样”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用Java无界队列的线程池会怎么样”吧!(1)背景引入今天跟大家聊一个互联网大厂的Java面
2023-06-04

java的redis队列怎么使用

Redis队列是一种适用于Java应用程序的高性能分布式队列。它可通过Jedis客户端库或SpringDataRedis模板使用。队列操作包括入队、出队、修剪和阻塞弹出。Redis队列优势在于高性能、可靠性和可扩展性,但存在数据丢失风险和消息大小限制。理解这些优势和局限性,开发者可以利用Redis队列提升应用程序性能和灵活性。
java的redis队列怎么使用
2024-04-02

java多线程队列的使用方法是什么

在Java中,可以使用BlockingQueue来实现多线程队列。BlockingQueue是一个线程安全的队列,它提供了put()和take()方法来实现元素的插入和获取。以下是使用BlockingQueue的示例代码:首先,创建一个B
2023-10-24

java中的消息队列怎么利用多线程实现

java中的消息队列怎么利用多线程实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、定义一个队列缓存池: //static修饰的成员变量和成员方法独立于该类的任何对象。也就
2023-05-31

怎么在java队列中使用软引用

本篇文章给大家分享的是有关怎么在java队列中使用软引用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情
2023-06-14

java的优先级队列怎么使用

Java的优先级队列可以使用`java.util.PriorityQueue`类来实现。下面是一个使用优先级队列的示例:```javaimport java.util.PriorityQueue;public class PriorityQ
2023-09-07

Java并发编程之LinkedBlockingQueue队列怎么使用

这篇文章主要介绍了Java并发编程之LinkedBlockingQueue队列怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java并发编程之LinkedBlockingQueue队列怎么使用文章都会有
2023-06-30

Java中怎么定义和使用循环队列

Java中怎么定义和使用循环队列,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、概述:1、原理:与普通队列的区别在于循环队列添加数据时,如果其有效数据end == max
2023-05-30

Java中的循环队列怎么利用数组实现

这篇文章将为大家详细讲解有关Java中的循环队列怎么利用数组实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用Java的数组实现一下循环队列。队列的类//循环队列class CirQueu
2023-05-31

怎么使用css3实现一个类在线直播的队列动画

这篇文章给大家分享的是有关怎么使用css3实现一个类在线直播的队列动画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。之前在群里有个朋友问了这样一个问题, 就是如何在 小程序 中实现类似 直播平台 的用户上线时的
2023-06-08

python怎么利用多线程+队列技术爬取中介网互联网网站排行榜

本篇内容介绍了“python怎么利用多线程+队列技术爬取中介网互联网网站排行榜”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目标站点分析本次
2023-06-30

Java中的异步与线程池怎么创建使用

这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。初始化线程的4种方式1.继承Thre
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录