DelayQueue实现延迟队列】的更多相关文章

public class Q { public static void main(String[] args) throws Exception { DelayQueue<Order> orders = new DelayQueue<>(); Order order1 = new Order(1000, "1x"); Order order2 = new Order(2000, "2x"); Order order3 = new Order(…
所谓的延迟队列最大的特征是它可以自动通过队列进行脱离,例如:现在有一些对象被临时保存着,但是有可能该集合对象是一个公共对象,那么里面的某些数据如果不在使用的时候就希望其可以在指定的时间达到后自动的消失. DelayQueue是延迟队列主要的使用类,所谓的延迟队列其实就是=BlockingQueue+PriorityQueue+Delayed Delayed接口定义如下: public interface Delayed extends Comparable<Delayed> { long ge…
背景 在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行的,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加锁,这样保证在更改同一资源时,没有其他更新操作干涉,保证数据一致性. 但如果在更新前对数据库更新加锁,那此时又来了新的更新数据库的请求,但这个更新操作不能丢弃掉,需要延迟执行,那这就需要添加到延迟队列中,延迟执行. 那么如何实现一个延迟队列?利用Redis的SortedSet和String这两种结构…
前言 在 jdk 的 juc 工具包中,提供了一种延迟队列 DelayQueue.延迟队列用处非常广泛,比如我们最常见的场景就是在网购或者外卖平台中发起一个订单,如果不付款,一般 15 分钟后就会被关闭,这个直接用定时任务是不好实现的,因为每个用户下单的时间并不确定,所以这时候就需要用到延迟队列. 什么是延迟队列 延迟队列本身也是队列,只不过这个队列是延迟的,意思就是说当我们把一条消息放入延迟队列,消息并不会立刻出队,而是会在到达指定时间之后(或者说过了指定时间)才会出队,从而被消费者消费. 利…
应用场景:有一批广告需要不定时上下架,有可能上下架的时间间隔很长,就没必要用定时器轮询,用延迟队列进行任务执行. public class Test2 { public static void main(String[] args) throws InterruptedException { DelayQueue<Message> delayQueue = new DelayQueue<>(); for (int i=1;i<11;i++){ Message m = new…
延迟队列DelayQueue take() 源码分析 在工作中使用了延迟队列,对其内部的实现很好奇,于是就研究了一下其运行原理,在这里就介绍一下take()方法的源码 1 take()源码 如下所示 public E take() throws InterruptedException { // 加锁的一个动作 保证获取数据的安全性 final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { for (;;) { /…
DelayQueue延迟队列原理剖析 介绍 DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现Delayed接口的元素,实现接口后相当于是每个元素都有个过期时间,当队列进行take获取元素时,先要判断元素有没有过期,只有过期的元素才能出队操作,没有过期的队列需要等待剩余过期时间才能进行出队操作. 源码分析 DelayQueue队列内部使用了PriorityQueue优先队列来进行存放数据,它采用的是二叉堆进行的优先队列,使用ReentrantLock锁来控制线程同步…
延迟阻塞队列DelayQueue DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素, 同时元素必须实现 Delayed 接口:在创建元素时可以指定多久才可以从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素. 使用场景 缓存系统:当能够从延迟队列DelayQueue中获取到元素时,说明缓存已经过期 定时任务调度:一分钟后发送短信 基于延迟队列,实现一个缓存系统 延迟队列中添加的元素,实现了Delayed接口 public c…
延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到…… 应用场景比较多,比如延时1分钟发短信,延时1分钟再次执行等,下面先看看延时队列demo之后再看延时队列在项目中的使用: 简单的延时队列要有三部分:第一实现了Delayed接口的消息体.第二消费消息的消费者.第三存放消息的延时队列,那下面就来看看延时队列demo. 一.消息体 package com.delqueue; import …
背景 最近项目中有个业务,需要对用户新增任务到期后进行业务处理.使用定时任务定时扫描过期时间,浪费资源,且不实时.只能使用延时队列处理. DelayQueue 第一想到的是java自带的延时队列delayqueue. 首先实现一个Delyed类. 实现两个最重要方法.第一个是队列里面的消息排序.DelayQueue底层使用的是阻塞队列.队列的消费端会去take队列的头部元素,没有元素就阻塞在那里.因此,延迟队列中的元素必须按执行时间顺序排列. @Override public int compa…