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返回的是超时时间与当前时间的差。