欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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