This commit is contained in:
lxyer 2018-08-11 12:26:34 +08:00
parent 03eabb1b81
commit 03bde29792
5 changed files with 20 additions and 13 deletions

View File

@ -9,7 +9,7 @@ redtimer是本人纯手工精心编写的一个任务定时调度器
项目地址:[https://gitee.com/tc608/redtimer](https://gitee.com/tc608/redtimer) 项目地址:[https://gitee.com/tc608/redtimer](https://gitee.com/tc608/redtimer)
#### 软件架构 #### 软件架构
里面的东西很简单,没什么架构而言 ![](http://img.1216.top/redbbs/20180811122309.png)
#### 安装使用教程 #### 安装使用教程

View File

@ -19,6 +19,11 @@ public abstract class AbstractTask implements Task {
this.theTime = scheduled.theTime().toInstant(ZoneOffset.of("+8")).toEpochMilli(); this.theTime = scheduled.theTime().toInstant(ZoneOffset.of("+8")).toEpochMilli();
} }
@Override
public String getName() {
return name;
}
@Override @Override
public long nextTime(){ public long nextTime(){
LocalDateTime next = scheduled.nextTime(); LocalDateTime next = scheduled.nextTime();

View File

@ -5,6 +5,8 @@ package com.lxyer.timer;
*/ */
public interface Task extends Runnable{ public interface Task extends Runnable{
String getName();
long nextTime(); long nextTime();
long theTime(); long theTime();
void run();
} }

View File

@ -14,10 +14,10 @@ public class TimerExecutor {
executor = Executors.newFixedThreadPool(n); executor = Executors.newFixedThreadPool(n);
} }
public void add(AbstractTask task){ public void add(Task task){
queue.put(task); queue.put(task);
} }
private void add(AbstractTask task, boolean upTime){ private void add(Task task, boolean upTime){
if (upTime) task.nextTime(); if (upTime) task.nextTime();
queue.put(task); queue.put(task);
} }
@ -27,7 +27,7 @@ public class TimerExecutor {
new Thread(()->{ new Thread(()->{
while (true){ while (true){
try{ try{
AbstractTask take = null; Task take = null;
try { try {
take = queue.take(); take = queue.take();
} catch (InterruptedException e) { } catch (InterruptedException e) {

View File

@ -9,12 +9,12 @@ import java.util.Set;
*/ */
class TimerQueue{ class TimerQueue{
Object lock = new Object(); Object lock = new Object();
AbstractTask[] queue = new AbstractTask[128]; Task[] queue = new Task[128];
Set<String> names = new HashSet<>(); Set<String> names = new HashSet<>();
int size=0; int size=0;
void put(AbstractTask task) { void put(Task task) {
remove(task.name); remove(task.getName());
synchronized (lock){ synchronized (lock){
int inx = size;//目标坐标 int inx = size;//目标坐标
while (inx > 0 && queue[inx-1].theTime() > task.theTime()){ while (inx > 0 && queue[inx-1].theTime() > task.theTime()){
@ -31,12 +31,12 @@ class TimerQueue{
queue[inx] = task; queue[inx] = task;
size++; size++;
names.add(task.name); names.add(task.getName());
lock.notify(); lock.notify();
} }
} }
AbstractTask take() throws InterruptedException { Task take() throws InterruptedException {
synchronized (lock){ synchronized (lock){
if (size == 0) lock.wait(); if (size == 0) lock.wait();
@ -44,7 +44,7 @@ class TimerQueue{
long nextTime = queue[0].theTime(); long nextTime = queue[0].theTime();
if (currentTime >= nextTime){ if (currentTime >= nextTime){
AbstractTask task = queue[0]; Task task = queue[0];
for (int i = 0; i < size;i++) { for (int i = 0; i < size;i++) {
queue[i] = queue[i+1]; queue[i] = queue[i+1];
} }
@ -58,13 +58,13 @@ class TimerQueue{
} }
} }
AbstractTask remove(String name){ Task remove(String name){
synchronized (lock){ synchronized (lock){
if(!names.contains(name)) return null; if(!names.contains(name)) return null;
AbstractTask take = null; Task take = null;
for (int i = 0; i < size-1; i++) { for (int i = 0; i < size-1; i++) {
if (name.equals(queue[i].name)){ if (name.equals(queue[i].getName())){
take = queue[i]; take = queue[i];
while (i < size+1){ while (i < size+1){
queue[i] = queue[i+1]; queue[i] = queue[i+1];