stem.out.print(" "+queue.poll());
}
?
System.out.println();
//指定Comparator 降序
queue = new PriorityBlockingQueue<>(6, (o1, o2) -> o2-o1);
queue.offer(99);
queue.offer(1099);
queue.offer(299);
queue.offer(992);
queue.offer(99288);
queue.offer(995);
//99288 1099 995 992 299 99
while (!queue.isEmpty()){
System.out.print(" "+queue.poll());
}
}
适用于需要根据优先级排序处理的场景
DelayQueue
Delay是一个延时获取元素的无界阻塞队列, 延时最长排在队尾
Delay队列元素实现Delayed接口通过getDelay
获取延时时间
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E> {
}
?
public interface Delayed extends Comparable<Delayed> {
long getDelay(TimeUnit unit);
}
DelayQueue应用场景
- 缓存系统的设计:DelayQueue存放缓存有效期,当可以获取到元素时,说明缓存过期
- 定时任务调度: 将定时任务的时间设置为延时时间,一旦可以获取到任务就开始执行
以定时线程池ScheduledThreadPoolExecutor
的定时任务ScheduledFutureTask
为例,它实现Delayed
获取延迟执行的时间
-
创建对象时,初始化数据
ScheduledFutureTask(Runnable r, V result, long ns, long period) {
super(r, result);
//time记录当前对象延迟到什么时候可以使用,单位是纳秒
this.time = ns;
this.period = period;
//sequenceNumber记录元素在队列中先后顺序 sequencer原子自增
//AtomicLong sequencer = new AtomicLong();
this.sequenceNumber = sequencer.getAndIncrement();
}
-
实现Delayed接口的getDelay方法
public long getDelay(TimeUnit unit) {
return unit.convert(time - now(), NANOSECONDS);
}
-
Delay接口继承了Comparable接口,目的是要实现compareTo方法来继续排序
public int compareTo(Delayed other) {
if (other == this) // compare zero if same object
return 0;
if (other instanceof ScheduledFutureTask) {
ScheduledFutureTask<?> x = (ScheduledFutureTask<?>)other;
long diff = time - x.time;
if (diff < 0)
return -1;
else if (diff > 0)
return 1;
else if (sequenceNumber < x.sequenceNumber)
&