我這建立了一個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解析信息发生异常--------------");
}
}
}
}
仅有的幸福2017-06-28 09:26:54
我沒用過 Timer,也不打算對如何調試這個程式提建議。我建議用 quartz 這樣的成熟框架來做這類事情。如果一定要自己設計的話,Timer 也不是最好的選擇,標準的思路應該是:
建立一個守護線程,管理每個定時任務的週期;
當一個定時任務執行時間到了,守護線程另開一個執行緒執行這個任務;
如果一個任務執行時間超過週期,則延遲下次執行時間到下一個週期。