package com.delayqueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/*延时队列DelayQueue,没有到期取不出队列内的元素(返回 null)*/
public class DelayedTask implements Delayed,Runnable {
public final int id;
private final long delayTime; // 延迟时间
private final long expire; // 到期时间
public DelayedTask(int id,long delay) {
this.id = id;
this.delayTime = delay;
expire = System.currentTimeMillis() + delay;
}
/**
* 剩余时间=到期时间-当前时间
*/
public long getDelay(TimeUnit unit) {
return unit.convert(this.expire - System.currentTimeMillis(),
TimeUnit.MILLISECONDS);
}
/**
* 优先队列里面优先级规则
*/
public int compareTo(Delayed o) {
return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o
.getDelay(TimeUnit.MILLISECONDS));
}
public static void main(String[] args) throws InterruptedException {
DelayQueue<DelayedTask> delayQueue = new DelayQueue<DelayedTask>();
CountDownLatch cdw = new CountDownLatch(5);
for(int i=0;i<5;i++){
DelayedTask dTask = new DelayedTask(i, i*1000);
delayQueue.offer(dTask);
cdw.countDown();
}
cdw.await();
while(!delayQueue.isEmpty()){
DelayedTask dt= delayQueue.poll();
Thread t = new Thread(dt, dt==null?"线程":dt.id+"");
t.start();
}
}
public void run() {
System.out.println(Thread.currentThread()+"run + currenttime "+System.currentTimeMillis());
}
}
运行效果:
每隔1秒输出一次