优化:使用 LinkedList 存贮任务队列

This commit is contained in:
lxy 2020-08-24 19:58:26 +08:00
parent 080c6d22ee
commit 84cd121ac3
2 changed files with 23 additions and 36 deletions

View File

@ -61,6 +61,6 @@ public class TimerExecutor {
e.printStackTrace(); e.printStackTrace();
} }
} }
}).start(); }, "Thread-Redtimer-0").start();
} }
} }

View File

@ -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;
} }