TaskQueue

package com.queue;

import java.util.Arrays;

public class TaskQueue {

     private TimerTask[] queue = new TimerTask[128];
     private int size = 0;

     // 返回任务队列的大小
     int size() {
         return size;
     }

     // 向优先级队列中,新增一个定时任务
     void add(TimerTask task) {
        if (size + 1 == queue.length) {
            queue = Arrays.copyOf(queue, 2*queue.length);
        }
        queue[++size] = task;
        fixUp(size);
     }

    // 上浮
    private void fixUp(int k) {
        while (k > 1) {
            int j = k >> 1;
            if (queue[j].nextExecutionTime <= queue[k].nextExecutionTime) {
                break;
            }
            TimerTask tmp = queue[j];
            queue[j] = queue[k];
            queue[k] = tmp;
            k = j;
        }
    }

    /**
     * 下沉
     */
    private void fixDown(int k) {
        int j ;
        while ((j = k << 1) <= size && j > 0) {
            if (j < size && queue[j].nextExecutionTime > queue[j+1].nextExecutionTime) {
                j++;
            }
            if (queue[k].nextExecutionTime <= queue[j].nextExecutionTime) {
                break;
            }
            TimerTask tmp = queue[j];  queue[j] = queue[k]; queue[k] = tmp;
            k = j;
        }
    }

    // 判断任务是否为空
     boolean isEmpty() {
         return size == 0;
     }

     // 清空队列
     void clear() {
         for (int i=1; i<=size; i++) {
             queue[i] = null;
         }
         size = 0;
     }

     // 获得队列中 第一个任务
     TimerTask getMin() {
         return queue[1];
     }

     // 获得队列中指定的任务
     TimerTask get(int i) {
         return queue[i];
     }

     // 为删除当前最近执行的任务
     void removeMin() {
        queue[1] = queue[size];
        queue[size--] = null;
        fixDown(1);
     }

     void quickRemove(int i) {
        assert i <= size;
        queue[i] = queue[size];
        queue[size--] = null;
     }
}

猜你喜欢

转载自blog.csdn.net/qq_34579060/article/details/82978972