}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class PeriodTimerManager { private Timer _timer; private AtomicBoolean isClean = new AtomicBoolean(Boolean.TRUE); private final static PeriodTimerManager instance = new PeriodTimerManager(); public final static PeriodTimerManager getInstance() { return instance; } private void checkAndRecreate() { if (isClean.compareAndSet(Boolean.TRUE, Boolean.FALSE)) { _timer = new Timer("T-PeriodNoticeTimer", false); } } public void schedule(TimerTask task, long delay, long period) { checkAndRecreate(); _timer.schedule(task, delay, period); } public void purge() { _timer.purge(); } public void cancel() { if (!ObjectUtil.isEmptyObject(_timer)) { _timer.cancel(); _timer = null; isClean.compareAndSet(Boolean.FALSE, Boolean.TRUE); } } --------------------------------------------------------------------------------------------------------------------------------------
public class PeriodNoticeTimer extends TimerTask { private int period; private int time; private TimerTask timerTask; private int currentTime; public PeriodNoticeTimer(int time, int period, TimerTask timerTask) { this.period = period; this.time = time; this.timerTask = timerTask; } public void begin() { //清除之前的任务 PeriodTimerManager.getInstance().cancel(); //工具只需最后的执行任务在执行 PeriodTimerManager.getInstance().schedule(this, 500, period); } @Override public void run() { timerTask.run(); currentTime++; if (currentTime >= time) { this.cancel(); //移除所有已取消的任务 PeriodTimerManager.getInstance().purge(); //在此计时器调用的计时器任务的 run方法内调用此方法, //就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务 //最后销毁定时器 PeriodTimerManager.getInstance().cancel(); } } public static void main(String[] args) { PeriodNoticeTimer pNoticeTimer = new PeriodNoticeTimer(10, 1000, new TimerTask() { private int index = 1; @Override public void run() { System.err.println("11111" + " " + index++); } }); pNoticeTimer.begin(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } PeriodNoticeTimer pNoticeTimer2 = new PeriodNoticeTimer(10, 2000, new TimerTask() { private int index = 1; @Override public void run() { System.err.println("2222" + " " + index++); } }); pNoticeTimer2.begin(); } }
