优化:使用 LinkedList 存贮任务队列
This commit is contained in:
parent
080c6d22ee
commit
84cd121ac3
@ -61,6 +61,6 @@ public class TimerExecutor {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).start();
|
}, "Thread-Redtimer-0").start();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,8 +2,8 @@ package net.tccn.timer.queue;
|
|||||||
|
|
||||||
import net.tccn.timer.task.Task;
|
import net.tccn.timer.task.Task;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -11,9 +11,8 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
public class TimerQueue {
|
public class TimerQueue {
|
||||||
Object lock = new Object();
|
Object lock = new Object();
|
||||||
Task[] queue = new Task[128];
|
LinkedList<Task> queue = new LinkedList();
|
||||||
Set<String> names = new HashSet<>();
|
Set<String> names = new HashSet<>();
|
||||||
int size = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新加调度任务
|
* 新加调度任务
|
||||||
@ -23,20 +22,14 @@ public class TimerQueue {
|
|||||||
public void push(Task task) {
|
public void push(Task task) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
remove(task.getName());
|
remove(task.getName());
|
||||||
int inx = size;//目标坐标
|
int inx = queue.size();//目标坐标
|
||||||
while (inx > 0 && queue[inx - 1].theTime() > task.theTime()) {
|
while (inx > 0 && queue.get(inx).theTime() > task.theTime()) {
|
||||||
inx--;
|
inx--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queue.length == size + 1)
|
queue.add(inx, task);
|
||||||
queue = Arrays.copyOf(queue, size * 2);
|
|
||||||
|
|
||||||
for (int i = size + 1; i > inx; i--) {
|
//size++;
|
||||||
queue[i] = queue[i - 1];
|
|
||||||
}
|
|
||||||
queue[inx] = task;
|
|
||||||
|
|
||||||
size++;
|
|
||||||
names.add(task.getName());
|
names.add(task.getName());
|
||||||
lock.notify();
|
lock.notify();
|
||||||
}
|
}
|
||||||
@ -50,19 +43,15 @@ public class TimerQueue {
|
|||||||
*/
|
*/
|
||||||
public Task take() throws InterruptedException {
|
public Task take() throws InterruptedException {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
while (size == 0) lock.wait(10);//循环避免非put线程唤醒空异常
|
while (queue.size() == 0) {
|
||||||
|
lock.wait(10);//循环避免非put线程唤醒空异常
|
||||||
|
}
|
||||||
|
|
||||||
long currentTime = System.currentTimeMillis();
|
long currentTime = System.currentTimeMillis();
|
||||||
long nextTime = queue[0].theTime();
|
long nextTime = queue.getFirst().theTime();
|
||||||
|
|
||||||
if (currentTime >= nextTime) {
|
if (currentTime >= nextTime) {
|
||||||
Task task = queue[0];
|
return queue.removeFirst();
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
queue[i] = queue[i + 1];
|
|
||||||
}
|
|
||||||
queue[size - 1] = null;
|
|
||||||
size--;
|
|
||||||
return task;
|
|
||||||
} else {
|
} else {
|
||||||
lock.wait(nextTime - currentTime);
|
lock.wait(nextTime - currentTime);
|
||||||
return take();
|
return take();
|
||||||
@ -92,23 +81,21 @@ public class TimerQueue {
|
|||||||
|
|
||||||
private Task get(String name, boolean remove) {
|
private Task get(String name, boolean remove) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
if (!names.contains(name)) return null;
|
if (!names.contains(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Task take = null;
|
Task take = null;
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < queue.size(); i++) {
|
||||||
if (name.equals(queue[i].getName())) {
|
if (name.equals(queue.get(i).getName())) {
|
||||||
take = queue[i];
|
take = queue.get(i);
|
||||||
if (!remove) break;
|
|
||||||
while (i < size + 1) {
|
|
||||||
queue[i] = queue[i + 1];
|
|
||||||
queue[i + 1] = null;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
names.remove(name);
|
|
||||||
size--;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (remove && take != null) {
|
||||||
|
queue.remove(take);
|
||||||
|
names.remove(take.getName());
|
||||||
|
}
|
||||||
|
|
||||||
lock.notify();
|
lock.notify();
|
||||||
return take;
|
return take;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user