支持延时获取元素的无界阻塞队列,队列元素必须实现Delayed接口,在创建元素的时候可以指定多久才能从队列中获取当前元素。时间到了才能从队列中获取到元素
简单使用
实体implements Delayed
public class MyDelayed implements Delayed {
private String key;
private long currentTime;
private long expireTime;
public MyDelayed(String key, long expireTime) {
this.key=key;
this.expireTime=expireTime;
this.currentTime = System.currentTimeMillis();
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
/**
* 获取剩余的时间
* @param unit
* @return
*/
@Override
public long getDelay(TimeUnit unit) {
return expireTime - unit.MILLISECONDS.toSeconds(System.currentTimeMillis()-currentTime);
}
/**
* 剩余时间升序排列
* @param o
* @return
*/
@Override
public int compareTo(Delayed o) {
MyDelayed p = (MyDelayed) o;
if(this.getDelay(TimeUnit.MICROSECONDS) > p.getDelay(TimeUnit.MICROSECONDS))
return 1;
if(this.getDelay(TimeUnit.MICROSECONDS) > p.getDelay(TimeUnit.MICROSECONDS))
return -1;
return 0;
}
@Override
public String toString() {
return "MyDelayed{" +
"key='" + key + '\'' +
", currentTime=" + currentTime +
", expireTime=" + expireTime +
'}';
}
}
测试
public class Test2 {
public static void main(String[] args) throws InterruptedException {
DelayQueue<MyDelayed> queue = new DelayQueue<>();
queue.add(new MyDelayed("key1", 4));
queue.add(new MyDelayed("key2", 3));
queue.add(new MyDelayed("key3", 2));
System.out.println("会一直阻塞,直到元素过期");
System.out.println(queue.take());
System.out.println(queue);
System.out.println(queue.take());
System.out.println(queue);
}
}
结果:
MyDelayed{key='key1', currentTime=1593955613953, expireTime=4}
[MyDelayed{key='key3', currentTime=1593955613954, expireTime=2}, MyDelayed{key='key2', currentTime=1593955613953, expireTime=3}]
MyDelayed{key='key3', currentTime=1593955613954, expireTime=2}
[MyDelayed{key='key2', currentTime=1593955613953, expireTime=3}]