您的位置:首页技术文章
文章详情页

java - 定时任务TimerTask没有被全部成功执行

【字号: 日期:2023-10-22 17:15:22浏览:33作者:猪猪

问题描述

我这建立了一个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 {@Overridepublic void run() { try {// 在这里写你要执行的内容/** * 查询实时功率等数据 */log.info('-------------UpdateCurrentEletricDataTimerTask正在执行--------------');remoteControlController.currentElectricDataCollecting();log.info('-------------UpdateCurrentEletricDataTimerTask执行完毕--------------'); } catch (Exception e) {log.info('-------------UpdateCurrentEletricDataTimerTask解析信息发生异常--------------'); }} }

public class UpdateCurrentControllerStatusTimerTask extends TimerTask {@Overridepublic void run() { try {// 在这里写你要执行的内容/** * 查询实时功率等数据 */log.info('-------------UpdateCurrentControllerStatusTimerTask正在执行--------------');remoteControlController.readRouterStatus();log.info('-------------UpdateCurrentControllerStatusTimerTask执行完毕--------------'); } catch (Exception e) {log.info('-------------UpdateCurrentControllerStatusTimerTask解析信息发生异常--------------'); }} }public class UpdateDailyEletricPowerTimerTask extends TimerTask {@Overridepublic void run() { try {// 在这里写你要执行的内容/** * 查询前昨两天日冻结正向有功总电量 */log.info('-------------UpdateDailyEletricPowerTimerTask正在执行--------------');remoteControlController.dailyPositiveElectricPowerCollecting();log.info('-------------UpdateDailyEletricPowerTimerTask执行完毕--------------'); } catch (Exception e) {log.info('-------------UpdateDailyEletricPowerTimerTask解析信息发生异常--------------'); }} }public class UpdateLampStatusTimerTask extends TimerTask {@Overridepublic 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解析信息发生异常--------------'); }} }}

问题解答

回答1:

我没用过 Timer,也不打算对如何调试这个程序提建议。我建议用 quartz 这样的成熟框架来做这类事情。如果一定要自己设计的话,Timer 也不是最好的选择,标准的思路应该是:

创建一个守护线程,管理每个定时任务的周期;

当一个定时任务执行时间到了,守护线程另开一个线程执行这个任务;

如果一个任务执行时间超过周期,则推迟下次执行时间到下一个周期。

标签: java
相关文章: