DelayQueue 延时用法 DelayQueue延时java
程序员文章站
2022-06-25 18:26:35
...
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返回的是超时时间与当前时间的差。