设为首页 加入收藏

TOP

10分钟从实现和使用场景聊聊并发包下的阻塞队列(五)
2023-09-23 15:44:47 】 浏览:522
Tags:10分 钟从实 包下的
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应用场景

  1. 缓存系统的设计:DelayQueue存放缓存有效期,当可以获取到元素时,说明缓存过期
  2. 定时任务调度: 将定时任务的时间设置为延时时间,一旦可以获取到任务就开始执行

以定时线程池ScheduledThreadPoolExecutor的定时任务ScheduledFutureTask为例,它实现Delayed获取延迟执行的时间

image.png

  1. 创建对象时,初始化数据

             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();
             }
    
  2. 实现Delayed接口的getDelay方法

     public long getDelay(TimeUnit unit) {
         return unit.convert(time - now(), NANOSECONDS);
     }
    
  3. 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)
                    &
首页 上一页 2 3 4 5 6 7 下一页 尾页 5/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇LeetCode297:hard级别中最简单的.. 下一篇Nacos实战(19)-Nacos健康检查机制..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目