Java自定义定时器
很多时候,我们需要使用定时器进行操作,比如数据统计、任务定时等等。但是很多时候,定时任务需要可以取消,需要重新设置时间等等,使用Java自带的Timer有时不太简单,所以想到对Timer进行扩展,实现自定义定时器的效果。
定时任务接口:
public interface StartTimer {
/**
* startNextTimer
* @描述: 开启下一次定时器
* @作者: zhuxl
* @创建时间: 2016年8月29日
*/
public abstract void startNextTimer();
/**
* startTimer
* @描述: 开启定时器
* @作者: zhuxl
* @创建时间: 2016年8月29日
*/
public abstract void startTimer();
/**
* stopTimer
* @描述: 停止定时器
* @作者: zhuxl
* @创建时间: 2016年8月29日
*/
public abstract void stopTimer();
/**
* restartTimer
* @描述: 重新启动
* @作者: zhuxl
* @创建时间: 2016年8月30日
*/
public abstract void restartTimer();
}
抽象实现:
/**
* 抽象实现
* @author zhuxl
*
*/
public abstract class StartTimerImpl implements StartTimer {
/**
*定时器
*/
protected Timer timer;
@Override
public void stopTimer() {
if(timer!=null){
timer.cancel();
}
}
@Override
public void restartTimer() {
startTimer();
}
}
而具体的定时器,比如报告生成,代码如下:
@Component("reportTimer")
public class ReportTimerImpl extends StartTimerImpl{
private Logger logger=Logger.getLogger(ReportTimerImpl.class);
@PostConstruct
public void init(){
this.startTimer();
}
@Override
public void startNextTimer() {
if(timer!=null){
timer.cancel();
logger.info("报告定时器取消!!");
}
timer=new Timer(true);
Date nextDate=computeNextDate(false);
if(nextDate==null){
logger.info("报告定时器已经关闭!!");
return ;
}
logger.info("报告定时器重新启动,下次执行时间:"+nextDate);
timer.schedule(new ReportTask(),nextDate);
}
/**
* computeNextDate
* @描述: 计算下一次时间
* @作者: zhuxl
* @创建时间: 2016年8月30日
* @return
*/
private Date computeNextDate(boolean flag){
...
//返回下一次任务时间
}
@Override
public void startTimer() {
if(timer!=null){
timer.cancel();
logger.info("报告定时器取消!!");
}
timer=new Timer(true);
Date nextDate=computeNextDate(true);
if(nextDate==null){
logger.info("报告定时器已经关闭!!");
return ;
}
logger.info("报告定时器启动,下次执行时间:"+nextDate);
timer.schedule(new ReportTask(),nextDate);
}
}
在使用中需要使用Spring的注解!!!ReportTask为具体的定时任务。在其他需要重启服务的地方重新调用reportTimer.restartTimer()即可;关闭定时器为reportTimer.stopTimer()。