DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。
方法 | 抛出异常 | 返回值 | 一直阻塞 | 超时退出 |
插入方法 | add | offer | put | Offer(time) |
移除方法 | remove | poll | take | Poll(time) |
检查方法 | element | peek | N/A | N/A |
延迟队列首先要创建一个实现Delayed接口的对象,DelayQueue的泛型只支持实现了Delayed接口的对象
- CompareTo(Delayed o):Delayed接口继承了Comparable接口,因此有了这个方法。
- getDelay(TimeUnit unit):这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。
package com.example.demo.test;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class TestDelayedDemo implements Delayed {
private String name ;
private long start = System.currentTimeMillis();
private long time ;
public TestDelayedDemo(String name, long time) {
this.name = name;
this.time = time;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert((start + time) - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
TestDelayedDemo o1 = (TestDelayedDemo) o;
return (int)(this.getDelay(TimeUnit.MILLISECONDS) - o1.getDelay(TimeUnit.MILLISECONDS));
}
@Override
public String toString() {
return "T1{" +
"name='" + name + '\'' +
", time=" + time +
'}';
}
}
测试类使用DelayQueue
package com.example.demo.test;
import java.util.concurrent.DelayQueue;
public class Test {
public static DelayQueue<TestDelayedDemo> queue = new DelayQueue<>();
public static void main(String[] args) {
queue.offer(new TestDelayedDemo("task1",15000));
queue.offer(new TestDelayedDemo("task2",8000));
queue.offer(new TestDelayedDemo("task3",3000));
queue.offer(new TestDelayedDemo("task4",1100));
queue.offer(new TestDelayedDemo("task5",2000));
queue.offer(new TestDelayedDemo("task6",5000));
queue.offer(new TestDelayedDemo("task7",100));
while(queue.size()>0){
try {
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
执行结果