forked from LupusNobilis/java-org.hwo
107 lines
2.0 KiB
Java
107 lines
2.0 KiB
Java
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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|