public interface GessTimer { /** * 超时处理函数 * @param key */ public void onTimeOut(String key); } import java.util.Date; import java.util.Iterator; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; public class GessTimerMgr extends TimerTask { private Map<String,TimerInstance> timerMap= new ConcurrentHashMap<String ,TimerInstance>(); private static GessTimerMgr instance=null; private GessTimerMgr(){}; private static Timer timer=null; private static Boolean isStart=false; private final static long timeStamp= 100; /** * 创建一个唯一的实例 * @return */ public static GessTimerMgr getInstance(){ if(instance == null) { synchronized(GessTimerMgr.class) { if(instance == null) { instance = new GessTimerMgr(); } } } return instance; } /** * 添加定时器 * @param key * @param timer * @param timeStamp 间隔时间 100毫秒的倍数 * @param delayStart 开始延迟时间 100毫秒的倍数 */ public void addTimer(String key,GessTimer timer,long timeStamp,long delayStart){ if(!isStart){ start(); } synchronized (timerMap) { TimerInstance temp= new TimerInstance(); temp.key= key; temp.delayStart=delayStart/timeStamp*timeStamp; temp.timer=timer; temp.timeStamp=timeStamp/timeStamp*timeStamp; temp.leftTime=temp.timeStamp; timerMap.put(key, temp); } } public void removeTimer(String key){ synchronized (timerMap) { timerMap.remove(key); } } public void start(){ if(!isStart){ synchronized(isStart){ if(!isStart){ Date date = new Date(); timer = new Timer(); timer.schedule(instance, date, timeStamp); isStart=true; } } } } /** * 停止定时器 */ public void stop(){ synchronized(timerMap){ timerMap.clear(); timer.cancel(); } } public void run() { synchronized(timerMap){ Iterator<String> iter = timerMap.keySet().iterator(); while(iter.hasNext()){ TimerInstance temp= timerMap.get(iter.next()); //还没有开始 if(temp.delayStart>0){ temp.delayStart-=timeStamp; continue; } //定时时间还没有到 if(temp.leftTime>0){ temp.leftTime-=timeStamp; continue; } //定时时间到调用超时处理函数 temp.leftTime=temp.timeStamp; temp.timer.onTimeOut(temp.key); } } } class TimerInstance{ public GessTimer timer; public String key; public long timeStamp; //间隔时间 100毫秒的倍数 public long delayStart;//开始延迟时间 100毫秒的倍数 public long leftTime; //剩余时间 } } public class Test implements GessTimer { public void onTimeOut(String key) { System.out.println(key); } public static void main(String [] s) throws InterruptedException{ Test t = new Test(); GessTimerMgr.getInstance().start(); GessTimerMgr.getInstance().addTimer("Test", t, 1000*10, 1000); Thread.sleep(1000*22); GessTimerMgr.getInstance().removeTimer("Test"); GessTimerMgr.getInstance().stop(); } }