package com.jqmobile.core.utils.timer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class BaseTimer extends Thread{
private final static BaseTimer bt;
private final static Object lock = new Object();
private final static long Timeout=10000;//60000;
static{
bt = new BaseTimer();
bt.setDaemon(true);
bt.start();
}
//
private List<TimerTask<?, ?>> list = Collections.synchronizedList(new ArrayList<TimerTask<?,?>>());
private long timeout=Timeout;//60000;
private BaseTimer(){
}
public static BaseTimer instance(){
return bt;
}
public static BaseTimer instance(long period){
BaseTimer b = new BaseTimer();
b.timeout=period;
return b;
}
@Override
public void run() {
try{
while (true) {
synchronized (lock) {
try {
lock.wait(timeout);
} catch (InterruptedException e) {
}
for(int i=list.size()-1; i>=0; i--){
TimerTask<?, ?> t = list.get(i);
long currentTimeMillis = System.currentTimeMillis();
if(0 == t._lastRunTime_ds){
t._lastRunTime_ds=currentTimeMillis;
}
//
if(0 == t._runTime_ds && currentTimeMillis>t._lastRunTime_ds+t.delay()){
t.executeNow();
if(t.period()>0){
t._runTime_ds++;
t._lastRunTime_ds=currentTimeMillis;
}else{
list.remove(i);
}
}else if(currentTimeMillis>t._lastRunTime_ds+t.period()){
t.executeNow();
t._runTime_ds++;
t._lastRunTime_ds=currentTimeMillis;
}
}
}
}
}finally{
run();
}
}
public BaseTimer add(TimerTask<?, ?> task){
this.list.add(task);
synchronized (lock) {
lock.notify();
}
return this;
}
public BaseTimer remote(TimerTask<?, ?> task){
this.list.remove(task);
return this;
}
}