Scheduler
parent
d6bfabf02a
commit
ce24c79d8a
|
@ -0,0 +1,106 @@
|
||||||
|
package org.hwo.scheduler;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Scheduler extends Thread{
|
||||||
|
|
||||||
|
private List<SchedulerTask> schedulerTasks;
|
||||||
|
private boolean exit;
|
||||||
|
|
||||||
|
public Scheduler(){
|
||||||
|
schedulerTasks = new LinkedList<Scheduler.SchedulerTask>();
|
||||||
|
exit = false;
|
||||||
|
|
||||||
|
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void schedule(Runnable runnable,int intervall,boolean fixedIntervall){
|
||||||
|
SchedulerTask task = new SchedulerTask(runnable, fixedIntervall, intervall);
|
||||||
|
this.schedulerTasks.add(task);
|
||||||
|
this.notify();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void shutdown(){
|
||||||
|
this.exit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
while (!exit){
|
||||||
|
|
||||||
|
synchronized (this) {
|
||||||
|
try {
|
||||||
|
this.wait(getWaitTime());
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
checkScheduledTasks();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkScheduledTasks(){
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
for (SchedulerTask task: schedulerTasks){
|
||||||
|
if (task.nextStart <= currentTime){
|
||||||
|
|
||||||
|
if (task.fixedIntervall)
|
||||||
|
task.nextStart += task.intervall;
|
||||||
|
else
|
||||||
|
task.nextStart = currentTime + task.intervall;
|
||||||
|
|
||||||
|
try {
|
||||||
|
task.runnable.run();
|
||||||
|
} catch (Exception e){
|
||||||
|
System.err.println("Scheduler caught runnable's Exception!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getWaitTime(){
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
long target = currentTime + 1000;
|
||||||
|
|
||||||
|
for (SchedulerTask task: schedulerTasks){
|
||||||
|
if (task.nextStart <= target)
|
||||||
|
target = task.nextStart;
|
||||||
|
}
|
||||||
|
int w = (int)(target-currentTime);
|
||||||
|
if (w < 1)
|
||||||
|
return 1;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class SchedulerTask {
|
||||||
|
|
||||||
|
private int intervall;
|
||||||
|
private Long nextStart;
|
||||||
|
private boolean fixedIntervall;
|
||||||
|
private Runnable runnable;
|
||||||
|
|
||||||
|
public SchedulerTask(Runnable runnable,boolean fixedIntervall,int intervall) {
|
||||||
|
this.intervall = intervall;
|
||||||
|
this.fixedIntervall = fixedIntervall;
|
||||||
|
this.runnable = runnable;
|
||||||
|
this.nextStart = System.currentTimeMillis() + this.intervall;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue