支持延時獲取元素的無界阻塞隊列,隊列元素必須實現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}]