DelayQueue 类实现了BlockingQueue, 可以参考前面文章有关BlockingQueue接口的详解。
DelayQueue在内部阻塞元素,直到某个延迟过期。DelayQueue中的元素必须实现java.util.concurrent.Delayed接口,下面是Delayed接口:
public interface Delayed extends Comparable<Delayed> {
public long getDelay(TimeUnit timeUnit);
}
通过getDelay()方法返回的值,在释放此元素之前的仍然处于延迟。
如果返回0或负值,则延迟将被视为已过期,并且元素在 DelayQueue调用下一个take()时释放。
getDelay()方法通过TimeUnit 实例的枚举值告诉定时器什么时候应该返回值。
TimeUnit枚举可以取这些值:
DAYS
HOURS
MINUTES
SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS
Delayed接口也继承了 java.lang.Comparable 接口,正如你所见,意思就是每个Delayed 对象可以互相比较. 这可能是在DelayQueue中内部使用的,用于对队列中的元素排序,因此它们是按失效时间释放的.
下面是 DelayQueue的用法:
public class DelayQueueExample {
public static void main(String[] args) {
DelayQueue queue = new DelayQueue();
Delayed element1 = new DelayedElement();
queue.put(element1);
Delayed element2 = queue.take();
}
}
DelayedElement是一个我创建的类的实现了Delayed 的接口 ,它并不是 java.util.concurrent包中的一部分.如果用到DelayQueue类的的话,你需要创建实现Delayed的元素.
参考翻译:http://tutorials.jenkov.com/java-util-concurrent/delayqueue.html