java延时_Java实现延时任务——DelayQueue
应用开发过程中,我们常常需要用到延时任务的地方,
举个栗子:
在我们提交订单之后,15分钟内未支付则需要自动取消订单,当然,实现的方式有很多种,我们尝试用延时任务方式进行。
java里自带的延时队列——DelayQueue即可实现。
什么是DelayQueue
DelayQueue——延时队列,提供了在指定时间才能获取队列元素的功能。也就是说只有在队列加入元素后指定时间间隔后才能取出元素。
DelayQueue.class
从上图可以看出,DelayQueue是一个接口,并且继承了Comparable,还有一个getDelay方法。这个方法是消息是否到期(是否可以被读取出来)判断的依据。当返回负数,说明消息已到期,此时消息就可以被读取出来了
所以我们需要先实现DelayQueue,实现其getDelay 和 compareTo方法(继承了Comparable,用于延迟队列内部比较排序 当前时间的延迟时间,比较对象的延迟时间)。
先上代码:
@Getter
@Setter
public class TestDelay implements Delayed {
private int taskId;
private Date taskTime;
// 延时30秒
private static final int EXPIRE_TIME = 30 * 1000;
@Override
public long getDelay(TimeUnit unit) {
return taskTime.getTime() + EXPIRE_TIME - System.currentTimeMillis();
}
@Override
public int compareTo(Delayed o) {
return this.taskTime.getTime() - ((TestDelay) o).taskTime.getTime() > 0 ? 1 : -1;
}
}
这里我们定义延时30秒。
然后,使用这个延时队列:
public class DelayTestApplication {
static DelayQueue queue = new DelayQueue<>();
public static void main(String[] args) throws InterruptedException {
Thread createTaskThread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1200);
} catch (InterruptedException e) {
e.printStackTrace();
}
createTask(i);
}
});
createTaskThread.start();
Thread checkTaskThread = new Thread(() -> {
checkTask();
});
checkTaskThread.start();
}
private static void createTask(int taskId) {
TestDelay delay = new TestDelay();
delay.setTaskId(taskId);
Date currentTime = new Date();
delay.setTaskTime(currentTime);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(formatter.format(currentTime) + ":任务被创建,任务id:" + taskId);
queue.put(delay);
}
private static void checkTask() {
while (true) {
try {
TestDelay delay = queue.take();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(formatter.format(new Date()) + ":任务被触发,任务id:" + delay.getTaskId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
打印结果如下:
结果
可以看到,刚好是30秒之后才能取到队列里的元素。
java延时_Java实现延时任务——DelayQueue相关推荐
- java怎么延时_java怎么实现延时
java实现延时的方法: 1.使用Timer类 Timer类负责计划任务的功能,也即指定的时间开始执行某个任务.Timer类的作用只是用于设置计划任务. Timer类的schedule方法可以按照时间 ...
- 【SpringBoot】43、SpringBoot中整合RabbitMQ实现延时队列(延时插件篇)
死信队列实现篇,参考文章:[SpringBoot]60.SpringBoot中整合RabbitMQ实现延时队列(死信队列篇) 一.介绍 1.什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需 ...
- 一阶rc电路时间常数_关于RC延时电路的延时时间计算
关于RC延时电路的延时时间计算 一.如何计算RC延时电路的时间常数? 简单的计算出RC延时电路所产生的时间延时,例如R=470K,C=0.1uF 时间常数直接用R*C就行了. 二.如何计算RC延时电路 ...
- 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...
- matlab怎样编写延时函数,编写延时函数的简单方法
原标题:编写延时函数的简单方法 如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的 这里用一个 ...
- c语言不用死等的延时函数,matlab延时函数怎么写
1. c语言延时函数delay,怎么算延时 下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为 ...
- 单片机硬件和软件延时、RTOS相对延时和绝对延时
已剪辑自: https://mp.weixin.qq.com/s/-RPLQn4KO9Aqu1fpfZeOKA 前不久有个读者在问关于延时的问题,大概就是问:软件延时和硬件延时是啥意思?做项目时他俩有 ...
- FreeRTOS中相对延时和绝对延时的区别
在公众号列表中,长按我的公众号,置顶公众号,就可以随时看到我. 相信许多朋友都有过这么一个需求:固定一个时间(周期)去处理某一件事情. 比如:固定间隔10ms去采集传感器的数据,然后通过一种算法计算出 ...
- 通电延时和断电延时的四种开关对应的梯形图
这四种触点开关分别是延时闭合的动合触点.延时断开的动断触点.延时闭合动的断触点和延时断开的动合触点. 文章目录 通电延时--缓慢吸合 延时断开的动断触点 延时闭合的动合触点 断电延时--缓慢释放 延时 ...
最新文章
- .Net winform中嵌入Flash
- oracle定时器定时删除30天前的数据_Redis的过期键删除策略
- 手机计算机快速切换功能,新功能!手势导航快速切换应用功能上线~
- Sencha Architect 安装与使用
- php 伪静态 500错误,Apache开启伪静态后报500错误.
- 全新的membership框架Asp.net Identity(1)——.Net membership的历史
- URI,URL与URN的区别
- Redis 安装部署介绍
- nacos 下线接口_微服务架构nacos注册中心为什么那么火
- python怎么读取txt文件-Python三种读取txt文件方式
- html中opacity的使用
- Mybatis缓存的使用和注意事项
- 《CSS世界》(张鑫旭)pdf
- python SVG图片转PNG
- 计算机cdr教程,计算机平面设计案例教程 (Photoshop+CorelDRAW)
- 圣思园java笔记_最详细JAVA高并发多线程VIP课程--圣思园--笔记
- 详解神奇的卡尔曼滤波(Kalman filter)算法
- 用Python能下载抖音无水印视频?免费教程来了!
- 关于PTC保险丝工作原理总结
- 岁月温柔-24 妈妈转到省医院第4天