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;
}
}
TaskQueue
猜你喜欢
转载自blog.csdn.net/qq_34579060/article/details/82978972
今日推荐
周排行