Java延迟队列 DelayQueue
时间:2019-02-16
本文章向大家介绍Java延迟队列 DelayQueue,主要包括Java延迟队列 DelayQueue使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
需求
下单完成,10分钟后,如果没有支付,发送消息,提醒支付。
分析
发消息好解决,这里主要讨论延时的问题,Java里,有个DelayQueue,可以实现延时的功能。
先贴运行结果、为了看到效果,代码里延时的是3s
Sat Feb 16 12:25:09 CST 2019启动,并加入了两条消息
Sat Feb 16 12:25:12 CST 2019 ..... 发送消息id 1
Sat Feb 16 12:25:12 CST 2019 ..... 发送消息id 2
代码:
public class Tt {
private DelayQueue<OrderInfo> messageQueue = new DelayQueue<OrderInfo>(); //消息队列
public static void main(String[] args) {
Tt t = new Tt();
OrderInfo oi = new OrderInfo("1", new Date().getTime() + 3000); // 加3000,表示延时3秒
OrderInfo oi2 = new OrderInfo("2", new Date().getTime() + 3000);
t.messageQueue.offer(oi); // 当接收到订单后,往队列里放一条消息
t.messageQueue.offer(oi2);
System.out.println(new Date().toString() + "启动,并加入了两条消息"); // 模拟接收到了两个订单
// 这里是消费线程,随程序运行启动
t.handle();
}
private void handle() {
ThreadPoolHolder.getThreadPool().submit(new Runnable() {
@Override
public void run() {
while (true) {
try {
OrderInfo message = messageQueue.take(); // take方法,有消息(延时时间<0的消息)取消息,没有,阻塞住。
// 这里查一遍订单.. 符合需求发消息,不符合不发
System.out.println(new Date().toString() + " ..... 发送消息id " + message.getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
// 消息体,必须实现Delayed接口
public class OrderInfo implements Delayed {
private String id;
public OrderInfo(String id, long excuteTime) {
this.id = id;
this.excuteTime = excuteTime;
}
private long excuteTime;// 延迟时长,这个是必须的属性因为要按照这个判断延时时长。
public String getId() {
return id;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(excuteTime,TimeUnit.NANOSECONDS) - unit.convert(System.currentTimeMillis(),TimeUnit.NANOSECONDS);
}
@Override
public int compareTo(Delayed o) {
OrderInfo msg = (OrderInfo) o;
return Integer.valueOf(this.id) > Integer.valueOf(msg.id) ? 1
: (Integer.valueOf(this.id) < Integer.valueOf(msg.id) ? -1 : 0);
}
}
- POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)
- 关关的刷题日记03—Leetcode 448. Find All Numbers Disappeared in an Array
- 关关的刷题日记04——Leetcode 283. Move Zeroes
- UESTC 1591 An easy problem A【线段树点更新裸题】
- 关关的刷题日记05 —— Leetcode 219. Contains Duplicate II
- 关关的刷题日记05 —— Leetcode 217. Contains Duplicate 方法1和方法2
- HDU 2602 Bone Collector(01背包裸题)
- Appium+python自动化13-native和webview切换
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
- 专知内容生产基石-数据爬取采集利器WebCollector 介绍
- python实现字符串模糊匹配
- 动态规划之01背包详解【解题报告】
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
- HDU 2546 饭卡(01背包裸题)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Java 11 新垃圾回收器 ZGC
- Red and Black(DFS 深搜练习)
- Codeforces Round #619 (Div. 2)
- 问题 1255: [蓝桥杯][算法提高]能量项链
- C# 开发技巧]如何防止程序多次运行 线程 进程
- 问题 1433: [蓝桥杯][2013年第四届真题]危险系数
- C# dev GridControl绑定数据不能显示
- Codeforces Round #621 (Div. 1 + Div. 2)(无比自闭的一夜)
- 牛客小白月赛22 A~~J
- P1914 小书童——密码
- sql server 2008 把远程的数据库的数据转移到本地数据数据库里
- 蓝桥杯 试题 基础练习 阶乘计算
- Java Lamada
- 试题 基础练习 高精度加法
- C# devExpress GridControl 行中行 子行 多级行