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