我这建立了一个TimerManager的类,目的是让系统跑起来之后,执行相应的4个任务。但是,4个任务之中只有两个被成功执行了,他们分别是timer和timer3,后面的两个timer2和timer4并没有被执行到。百思不得其解,所以来sf让各位帮我看看是什么问题,下面是TimerManager的代码:
public class TimerManager {
@Resource
RemoteControlController remoteControlController;
@Resource
ManagementStationService managementStationService;
@Resource
ControllerStatusController controllerStatusController;
// 时间间隔
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
public static final long PERIOD_DAY2 = 60 * 60 * 1000;
private static final long PERIOD_DAY3 = 60 * 60 * 1000;
private static final int START_TIME = 1;
private static final int START_TIME2 = 0;
private Logger log = Logger.getLogger("ServerInfo");
public void initTimerManager() {
Calendar calendar = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
/*** 定制每日1:00执行方法 ***/
calendar.set(Calendar.HOUR_OF_DAY, START_TIME);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
/*** 定制每日0:00执行方法 ***/
calendar2.set(Calendar.HOUR_OF_DAY, START_TIME2);
calendar2.set(Calendar.MINUTE, 0);
calendar2.set(Calendar.SECOND, 0);
Date date = calendar.getTime(); //第一次执行定时任务的时间 ,date重启不执行
Date date2 = calendar.getTime();//date2、3重启执行
Date date3 = calendar2.getTime();
// 如果第一次执行定时任务的时间 小于 当前的时间
// 此时要在第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (date.before(new Date())) {
date = this.addDay(date, 1);
}
Timer timer = new Timer();
Timer timer2 = new Timer();
Timer timer3 = new Timer();
Timer timer4 = new Timer();
UpdateDailyEletricPowerTimerTask task = new UpdateDailyEletricPowerTimerTask();
UpdateLampStatusTimerTask task2 = new UpdateLampStatusTimerTask();
UpdateCurrentEletricDataTimerTask task3 = new UpdateCurrentEletricDataTimerTask();
UpdateCurrentControllerStatusTimerTask task4 = new UpdateCurrentControllerStatusTimerTask();
// 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task, date, PERIOD_DAY);
timer3.schedule(task3, date3, PERIOD_DAY2);
timer4.schedule(task4, date3, PERIOD_DAY3);//先更新路由状态
timer2.schedule(task2, date2, PERIOD_DAY);//再更新灯状态
}
// 增加或减少天数
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
public class UpdateCurrentEletricDataTimerTask extends TimerTask {
@Override
public void run() {
try {
// 在这里写你要执行的内容
/**
* 查询实时功率等数据
*/
log.info("-------------UpdateCurrentEletricDataTimerTask正在执行--------------");
remoteControlController.currentElectricDataCollecting();
log.info("-------------UpdateCurrentEletricDataTimerTask执行完毕--------------");
} catch (Exception e) {
log.info("-------------UpdateCurrentEletricDataTimerTask解析信息发生异常--------------");
}
}
}
public class UpdateCurrentControllerStatusTimerTask extends TimerTask {
@Override
public void run() {
try {
// 在这里写你要执行的内容
/**
* 查询实时功率等数据
*/
log.info("-------------UpdateCurrentControllerStatusTimerTask正在执行--------------");
remoteControlController.readRouterStatus();
log.info("-------------UpdateCurrentControllerStatusTimerTask执行完毕--------------");
} catch (Exception e) {
log.info("-------------UpdateCurrentControllerStatusTimerTask解析信息发生异常--------------");
}
}
}
public class UpdateDailyEletricPowerTimerTask extends TimerTask {
@Override
public void run() {
try {
// 在这里写你要执行的内容
/**
* 查询前昨两天日冻结正向有功总电量
*/
log.info("-------------UpdateDailyEletricPowerTimerTask正在执行--------------");
remoteControlController.dailyPositiveElectricPowerCollecting();
log.info("-------------UpdateDailyEletricPowerTimerTask执行完毕--------------");
} catch (Exception e) {
log.info("-------------UpdateDailyEletricPowerTimerTask解析信息发生异常--------------");
}
}
}
public class UpdateLampStatusTimerTask extends TimerTask {
@Override
public void run() {
try {
// 在这里写你要执行的内容
/**
* 更新全部灯具状态
*/
log.info("-------------UpdateLampStatusTimerTask正在执行--------------");
List<ManagementStation> mlist = managementStationService.getManagementStationList();
int msize = mlist.size();
log.info("**********UpdateLampStatusTimerTask获取的管理所长度为"+msize);
if(msize > 0){
String[] arr = new String[msize];
for(int i = 0; i < msize; i++)
arr[i] = String.valueOf(mlist.get(i).getMid());
boolean realTime = false;
controllerStatusController.UpdateControllerStatus(arr,realTime);
}
log.info("-------------UpdateLampStatusTimerTask执行完毕-------------");
} catch (Exception e) {
log.info("-------------UpdateLampStatusTimerTask解析信息发生异常--------------");
}
}
}
}
我没用过 Timer,也不打算对如何调试这个程序提建议。我建议用 quartz 这样的成熟框架来做这类事情。如果一定要自己设计的话,Timer 也不是最好的选择,标准的思路应该是:
创建一个守护线程,管理每个定时任务的周期;
当一个定时任务执行时间到了,守护线程另开一个线程执行这个任务;
如果一个任务执行时间超过周期,则推迟下次执行时间到下一个周期。