`
xiemingmei
  • 浏览: 207661 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics