public class Test {
private static DelayQueue<DelayedTask> dq = new DelayQueue<DelayedTask>();
public static void main(String[] arg) throws Exception {
testDelayQueue();
}
static class DelayedTask implements Delayed {
private String title;
private long delayedInSecond;
private long createDateSeconds;
public DelayedTask(String title,long delayedInSecond) {
this.title = title;
this.delayedInSecond = delayedInSecond;
this.createDateSeconds = System.currentTimeMillis()/1000;
}
@Override
public int compareTo(Delayed o) {
if (getDelay(TimeUnit.SECONDS) > o.getDelay(TimeUnit.SECONDS) ) {
return 1;
}else if(getDelay(TimeUnit.SECONDS) < o.getDelay(TimeUnit.SECONDS)) {
return -1;
} else{
return 0;
}
}
@Override
public long getDelay(TimeUnit unit) {
long currentInSeconds = System.currentTimeMillis()/1000;
long diff = createDateSeconds+delayedInSecond - currentInSeconds;
return unit.convert(diff, TimeUnit.SECONDS);
}
public String toString() {
return this.title;
}
}
private static void testDelayQueue() throws Exception {
//生产者代码
dq.put(new DelayedTask("A", 31l));
dq.put(new DelayedTask("B", 30l));
dq.put(new DelayedTask("C", 20l));
dq.put(new DelayedTask("D", 10l));
//消费者代码
while(true) {
System.out.println(dq.take());
}
}
}
输出:
D
C
B
A
重点注意getDelay返回的是超时时间与当前时间的差。
分享到:
相关推荐
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。这篇文章主要介绍了springboot执行延时任务-DelayQueue的使用,需要的朋友可以参考下
DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。
java使用DelayQueue延迟队列和Redis缓存实现订单自动取消功能
学习视频,可以丰富java知识。能够获得更多的专业技能
DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 源代码下载
1. 什么是延时队列? 2. 如何实现一个高效的延时队列?...3. DelayQueue的实现原理 4. RabbitMQ实现延时队列的基本原理 5. Redis实现延时队列的基本原理 6. 时间轮(Time Wheel) 7. 几种方案的对比
主要给大家介绍了java利用delayedQueue实现本地的延迟队列的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
主要为大家详细介绍了Java多线程并发开发之DelayQueue使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...
2.在数据量大的情况下延时较高,规定内处理不完,影响业务,虽然可以启动多个进程来处理,这样会带来额外的维护成本,不能从根本上解决。 3.每个业务都要维护一个自己的扫表逻辑。 当业务越来越多时,发现扫表部分的...
#### 整体结构 整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个...
延迟队列, 参考有赞延迟队列设计实现
具体代码参考
使用延时消息的典型场景,例如: 在电商系统中,用户下完订单30分钟内没支付,则订单可能会被取消。 在电商系统中,用户七天内没有评价商品,则默认好评。 这些场景对应的解决方案,包括: 轮询遍历数据库记录 ...
除了具有很好的并发性的Collections,java.util.concurrent还引入了其他一些预先构建的组件,它们可帮助您调整和执行多线程应用程序中的线程。
Agenda • Methodology and Process • Tools of Load Test • Tuning Components in the Software Stack > Operating System > Java Virtual Machine > Application Container > Application Architecture ...
JDK 内置的延迟队列 DelayQueue 实现简单 数据内存态,不可靠 一致性相对低的场景 调度框架和 MySQL 进行短间隔轮询 实现简单,可靠性高 存在明显的性能瓶颈 数据量较少实时性相对低的场景 RabbitMQ 的 ...
对比而言时间轮更适合任务数很大的延时场景,它的任务插入和删除时间复杂度都为O(1)。对于延迟超 过时间轮所能表示的范围有两种处理方式,一是通过增加一个字段-轮数,Netty 就是这样实现的。二是 多层次时间轮,...
主要为大家详细介绍了redis实现简单队列的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下