java定时操作之Timer和TimerTas(三)

2014-11-24 01:45:17 · 作者: · 浏览: 11
作用是尽量将队列中指定位置(k)的任务向队列前面移动,

// 即提高它的优先级. 因为新加入的方法很有可能比已经在任务队列中的其它任务要更早执行.

private void fixUp(int k) {

while (k > 1) {

int j = k >> 1;// 左移一位,相当于除以2

if (queue[j].nextExecutionTime <= queue[k].nextExecutionTime) 内容来自dedecms

break;

TimerTask tmp = queue[j];

queue[j] = queue[k];

queue[k] = tmp;

k = j;

}

}

// 从任务队列中移除一个任务的过程, 首先直接将当前任务队列中最后一个任务赋给queue[1],

// 然后将队列中任务数量--, 最后和上面类似, 但是这里是调用fixDown(int k)方法了, 尽量将k位置的任务向队列后面移动.

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++; // j indexes smallest kid

if (queue[k].nextExecutionTime <= queue[j].nextExecutionTime)

break;

TimerTask tmp = queue[j];

queue[j] = queue[k];

queue[k] = tmp;

k = j;

}

}

/**

* Establishes the heap invariant (described above) in the entire tree,

* assuming nothing about the order of the elements prior to the call.

*/

void heapify() {

for (int i = size / 2; i >= 1; i--)

fixDown(i);

}

}

2.任务调度TimerThread

Java代码

// 计时器线程

class TimerThread extends Thread {

// 新任务是否被安排

boolean newTasksMayBeScheduled = true;

// 任务队列

private TaskQueue queue;

TimerThread(TaskQueue queue) {

this.queue = queue;

}

public void run() {

try {

mainLoop();

} finally {

// Someone killed this Thread, behave as if Timer cancelled

synchronized (queue) {

newTasksMayBeScheduled = false;

queue.clear(); // Eliminate obsolete references

}

}

}

private void mainLoop() {

while (true) {

try {

TimerTask task;

boolean taskFired;

synchronized (queue) {

// Wait for queue to become non-empty

while (queue.isEmpty() && newTasksMayBeScheduled)

queue.wait();

if (queue.isEmpty())

break; // Queue is empty and will forever remain; die

// Queue nonempty; look at first evt and do the right thing

long currentTime, executionTime;

task = queue.getMin();

synchronized (task.lock) {

if (task.state == TimerTask.CANCELLED) {

queue.removeMin();

continue; // No action required, poll queue again

}

currentTime = System.currentTimeMillis();

executionTime = task.nextExecutionTime;

if (taskFired = (executionTime <= currentTime)) {

if (task.period == 0) { // Non-repeating, remove

queue.removeMin();

task.state = TimerTask.EXECUTED;

} else { // Repeating task, reschedule

queue

.rescheduleMin(task.period < 0 currentTime

- task.period

: executionTime + task.period);

}

}

}

if (!taskFired) // Task hasn't yet fired; wait

queue.wait(executionTime - currentTime);

}

if (taskFired) // Task fired; run it, holding no locks

task.run();

} catch (InterruptedException e) {

}

}

}

}

// 计时器线程

class TimerThread extends Thread {

// 新任务是否被安排

boolean newTasksMayBeScheduled = true;

// 任务队列

private TaskQueue queue;

TimerThread(TaskQueue queue) {

this.queue = queue;

}

public void run() {

try {

mainLoop();

} finally {

// Someone killed this Thread, behave as if Timer cancelled

synchronized (queue) {

newTasksMayBeScheduled = false;

queue.clear(); // Eliminate obsolete references

}

}

}

private void mainLoop() {

while (true) {

try {

TimerTask task;

boolean taskFired;

synchronized (queue) {

// Wait for queue to become non-empty

while (queue.isEmpty() && newTasksMayBeScheduled)

queue.wait();

if (queue.isEmpty())

break; // Queue is empty and will forever remain; die

// Queue nonempty; look at first evt and do the ri