iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java线程池队列中的延迟队列DelayQueue怎么使用
  • 540
分享到

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

2023-07-04 17:07:22 540人浏览 泡泡鱼
摘要

今天小编给大家分享一下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怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java线程池队列中的延迟队列DelayQueue怎么使用

本文链接: https://www.lsjlt.com/news/346632.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java线程池队列中的延迟队列DelayQueue怎么使用
    今天小编给大家分享一下Java线程池队列中的延迟队列DelayQueue怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-04
  • 详解Java线程池队列中的延迟队列DelayQueue
    目录DelayQueue延迟队列DelayQueue使用场景DelayQueue属性DelayQueue构造方法实现Delayed接口使用示例DelayQueue总结在阻塞队里中,除...
    99+
    2022-12-08
    Java延迟队列DelayQueue Java延迟队列 Java DelayQueue
  • java并发中DelayQueue延迟队列原理的示例分析
    这篇文章给大家分享的是有关java并发中DelayQueue延迟队列原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。介绍DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现...
    99+
    2023-06-15
  • 如何在Java中使用延迟队列
    本篇文章给大家分享的是有关如何在Java中使用延迟队列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  DelayQueue首先,定义一个延迟任务package&nb...
    99+
    2023-06-14
  • 使用Redis怎么实现延迟队列
    本篇文章给大家分享的是有关使用Redis怎么实现延迟队列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方案一:采用通过定时任务采用数据库/非关系型数据库轮询方案。优点: 实现简...
    99+
    2023-06-15
  • thinkphp6使用think-queue怎么实现普通队列和延迟队列
    本文小编为大家详细介绍“thinkphp6使用think-queue怎么实现普通队列和延迟队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“thinkphp6使用think-queue怎么实现普通队列和延迟队列”文章能帮助大家解决疑惑,下...
    99+
    2023-06-30
  • 详解RabbitMQ中死信队列和延迟队列的使用详解
    目录简介死信队列简介示例延迟队列简介使用场景简介 本文介绍RabbitMQ的死信队列和延迟队列。 本内容也是Java后端面试中常见的问题。 死信队列 简介 DLX,全称为Dead-L...
    99+
    2022-11-13
  • Java怎么自定义线程池中队列
    本篇内容介绍了“Java怎么自定义线程池中队列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景业务交互的过程中涉及到了很多关于SFTP下载...
    99+
    2023-07-02
  • 使用Java无界队列的线程池会怎么样
    本篇内容主要讲解“使用Java无界队列的线程池会怎么样”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用Java无界队列的线程池会怎么样”吧!(1)背景引入今天跟大家聊一个互联网大厂的Java面...
    99+
    2023-06-04
  • java多线程队列的使用方法是什么
    在Java中,可以使用BlockingQueue来实现多线程队列。BlockingQueue是一个线程安全的队列,它提供了put()...
    99+
    2023-10-24
    java
  • java中的消息队列怎么利用多线程实现
    java中的消息队列怎么利用多线程实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义一个队列缓存池: //static修饰的成员变量和成员方法独立于该类的任何对象...
    99+
    2023-05-31
    java 多线程 ava
  • java的优先级队列怎么使用
    Java的优先级队列可以使用`java.util.PriorityQueue`类来实现。下面是一个使用优先级队列的示例:```jav...
    99+
    2023-09-07
    java
  • 怎么在java队列中使用软引用
    本篇文章给大家分享的是有关怎么在java队列中使用软引用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情...
    99+
    2023-06-14
  • Java并发编程之LinkedBlockingQueue队列怎么使用
    这篇文章主要介绍了Java并发编程之LinkedBlockingQueue队列怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java并发编程之LinkedBlockingQueue队列怎么使用文章都会有...
    99+
    2023-06-30
  • Java中怎么定义和使用循环队列
    Java中怎么定义和使用循环队列,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、概述:1、原理:与普通队列的区别在于循环队列添加数据时,如果其有效数据end == max...
    99+
    2023-05-30
    java
  • Java中的循环队列怎么利用数组实现
    这篇文章将为大家详细讲解有关Java中的循环队列怎么利用数组实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用Java的数组实现一下循环队列。队列的类//循环队列class CirQueu...
    99+
    2023-05-31
    循环队列 java
  • 怎么使用css3实现一个类在线直播的队列动画
    这篇文章给大家分享的是有关怎么使用css3实现一个类在线直播的队列动画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。之前在群里有个朋友问了这样一个问题, 就是如何在 小程序 中实现类似 直播平台 的用户上线时的 ...
    99+
    2023-06-08
  • python怎么利用多线程+队列技术爬取中介网互联网网站排行榜
    本篇内容介绍了“python怎么利用多线程+队列技术爬取中介网互联网网站排行榜”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目标站点分析本次...
    99+
    2023-06-30
  • Java中的异步与线程池怎么创建使用
    这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。初始化线程的4种方式1.继承Thre...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作