一起来聊聊 DelayQueue

DelayQueue可以实现在时间上的排序,这个DelayQueue能实现按照在里面等待的时间来进行排序。

import java.util.Calendar;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class T07_DelayQueue {

  static BlockingQueue<MyTask> tasks = new DelayQueue<>();

  static Random r = new Random();
  
  static class MyTask implements Delayed {
    String name;
    long runningTime;
    
    MyTask(String name, long rt) {
      this.name = name;
      this.runningTime = rt;
    }

    @Override
    public int compareTo(Delayed o) {
      if(this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS))
        return -1;
      else if(this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS))
        return 1;
      else 
        return 0;
    }

    @Override
    public long getDelay(TimeUnit unit) {
      
      return unit.convert(runningTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }
    
    
    @Override
    public String toString() {
      return name + " " + runningTime;
    }
  }

  public static void main(String[] args) throws InterruptedException {
    long now = System.currentTimeMillis();
    MyTask t1 = new MyTask("t1", now + 1000);
    MyTask t2 = new MyTask("t2", now + 2000);
    MyTask t3 = new MyTask("t3", now + 1500);
    MyTask t4 = new MyTask("t4", now + 2500);
    MyTask t5 = new MyTask("t5", now + 500);
    
    tasks.put(t1);
    tasks.put(t2);
    tasks.put(t3);
    tasks.put(t4);
    tasks.put(t5);
    
    System.out.println(tasks);
    
    for(int i=0; i<5; i++) {
      System.out.println(tasks.take());
    }
  }
}

这里我们new了一个DelayQueue,他是BlockingQueue的一种,也是用于阻塞的队列,这个阻塞队列装任务的时候要求你必须实现Delayed接口,Delayed往后拖延推迟,Delayed需要做一 个比较compareTo,最后这个队列的实现,这个时间等待越短的就会有优先的得到运行,所以你需要做一个比较,这里面他就有一个排序了 ,这个排序是按时间来排的,所以去做好,哪个时间返回什么样的值,不同的内容比较的时候可以按照时间来排序。

如果你对compareTo和Comparable不理解的话可以去翻找以前老师讲的策略模式。总而言之,你要实现Comparable接口重写compareTo方法来确定你这个任务之间是怎么排序的。

getDelay去拿到你Delay多长时间了。往里头装任务的时候首先拿到当前时间,在当前时间的基础之上指定在多长时间之后这个任务要运行,添加顺序参看代码,但是当我们去拿的时候,一般的队列是先加哪个先往外拿那个,先进先出。

这个队列是不一样的, 按时间进行排序(按紧迫程度进行排序)。DelayQueue就是按照时间进行任务调度。

DelayQueue本质上用的是一个PriorityQueue, PriorityQueue是从AbstractQueue继承的。

PriorityQueue特点是它内部你往里装的时候并不是按顺序往里装的,而是内部进行了一个排序。按照优先级,最小的优先。它内部实现的结构是一个二 叉树,这个二叉树可以认为是堆排序里面的那个最小堆值排在最上面。

猜你喜欢

转载自blog.csdn.net/bjmsb/article/details/106301407