Saya mencipta kelas TimerManager untuk membenarkan sistem melaksanakan empat tugasan yang sepadan selepas ia dijalankan. Bagaimanapun, hanya dua daripada empat tugasan yang berjaya dilaksanakan iaitu pemasa dan pemasa3, dan dua tugasan berikut, pemasa2 dan pemasa4, tidak dilaksanakan. Saya tidak dapat memahaminya, jadi saya datang ke SF dan meminta anda membantu saya mengetahui masalahnya Berikut ialah kod 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解析信息发生异常--------------");
}
}
}
}
Saya tidak pernah menggunakan Pemasa dan tidak akan memberi nasihat tentang cara untuk menyahpepijat program ini. Saya mengesyorkan menggunakan rangka kerja matang seperti kuarza untuk perkara seperti ini. Jika anda mesti mereka sendiri, Pemasa bukanlah pilihan terbaik. Idea standard ialah:
Buat benang daemon untuk menguruskan kitaran setiap tugas yang dijadualkan
Apabila masa pelaksanaan tugas yang dijadualkan tamat, benang daemon membuka satu lagi urutan untuk melaksanakan tugasan
Jika masa pelaksanaan tugas melebihi kitaran, masa pelaksanaan seterusnya akan ditangguhkan ke kitaran seterusnya.