DelayQueue 延时用法

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返回的是超时时间与当前时间的差。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值