java - 定時(shí)任務(wù)TimerTask沒(méi)有被全部成功執(zhí)行
問(wèn)題描述
我這建立了一個(gè)TimerManager的類,目的是讓系統(tǒng)跑起來(lái)之后,執(zhí)行相應(yīng)的4個(gè)任務(wù)。但是,4個(gè)任務(wù)之中只有兩個(gè)被成功執(zhí)行了,他們分別是timer和timer3,后面的兩個(gè)timer2和timer4并沒(méi)有被執(zhí)行到。百思不得其解,所以來(lái)sf讓各位幫我看看是什么問(wèn)題,下面是TimerManager的代碼:
public class TimerManager { @Resource RemoteControlController remoteControlController;@Resource ManagementStationService managementStationService; @Resource ControllerStatusController controllerStatusController; // 時(shí)間間隔 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執(zhí)行方法 ***/calendar.set(Calendar.HOUR_OF_DAY, START_TIME);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);/*** 定制每日0:00執(zhí)行方法 ***/calendar2.set(Calendar.HOUR_OF_DAY, START_TIME2);calendar2.set(Calendar.MINUTE, 0);calendar2.set(Calendar.SECOND, 0);Date date = calendar.getTime(); //第一次執(zhí)行定時(shí)任務(wù)的時(shí)間 ,date重啟不執(zhí)行Date date2 = calendar.getTime();//date2、3重啟執(zhí)行Date date3 = calendar2.getTime();// 如果第一次執(zhí)行定時(shí)任務(wù)的時(shí)間 小于 當(dāng)前的時(shí)間// 此時(shí)要在第一次執(zhí)行定時(shí)任務(wù)的時(shí)間加一天,以便此任務(wù)在下個(gè)時(shí)間點(diǎn)執(zhí)行。如果不加一天,任務(wù)會(huì)立即執(zhí)行。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();// 安排指定的任務(wù)在指定的時(shí)間開(kāi)始進(jìn)行重復(fù)的固定延遲執(zhí)行。timer.schedule(task, date, PERIOD_DAY);timer3.schedule(task3, date3, PERIOD_DAY2);timer4.schedule(task4, date3, PERIOD_DAY3);//先更新路由狀態(tài)timer2.schedule(task2, date2, PERIOD_DAY);//再更新燈狀態(tài) } // 增加或減少天數(shù) 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 {// 在這里寫(xiě)你要執(zhí)行的內(nèi)容/** * 查詢實(shí)時(shí)功率等數(shù)據(jù) */log.info('-------------UpdateCurrentEletricDataTimerTask正在執(zhí)行--------------');remoteControlController.currentElectricDataCollecting();log.info('-------------UpdateCurrentEletricDataTimerTask執(zhí)行完畢--------------'); } catch (Exception e) {log.info('-------------UpdateCurrentEletricDataTimerTask解析信息發(fā)生異常--------------'); }} }
public class UpdateCurrentControllerStatusTimerTask extends TimerTask {@Overridepublic void run() { try {// 在這里寫(xiě)你要執(zhí)行的內(nèi)容/** * 查詢實(shí)時(shí)功率等數(shù)據(jù) */log.info('-------------UpdateCurrentControllerStatusTimerTask正在執(zhí)行--------------');remoteControlController.readRouterStatus();log.info('-------------UpdateCurrentControllerStatusTimerTask執(zhí)行完畢--------------'); } catch (Exception e) {log.info('-------------UpdateCurrentControllerStatusTimerTask解析信息發(fā)生異常--------------'); }} }public class UpdateDailyEletricPowerTimerTask extends TimerTask {@Overridepublic void run() { try {// 在這里寫(xiě)你要執(zhí)行的內(nèi)容/** * 查詢前昨兩天日凍結(jié)正向有功總電量 */log.info('-------------UpdateDailyEletricPowerTimerTask正在執(zhí)行--------------');remoteControlController.dailyPositiveElectricPowerCollecting();log.info('-------------UpdateDailyEletricPowerTimerTask執(zhí)行完畢--------------'); } catch (Exception e) {log.info('-------------UpdateDailyEletricPowerTimerTask解析信息發(fā)生異常--------------'); }} }public class UpdateLampStatusTimerTask extends TimerTask {@Overridepublic void run() { try {// 在這里寫(xiě)你要執(zhí)行的內(nèi)容/** * 更新全部燈具狀態(tài) */log.info('-------------UpdateLampStatusTimerTask正在執(zhí)行--------------');List<ManagementStation> mlist = managementStationService.getManagementStationList();int msize = mlist.size();log.info('**********UpdateLampStatusTimerTask獲取的管理所長(zhǎng)度為'+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執(zhí)行完畢-------------'); } catch (Exception e) {log.info('-------------UpdateLampStatusTimerTask解析信息發(fā)生異常--------------'); }} }}
問(wèn)題解答
回答1:我沒(méi)用過(guò) Timer,也不打算對(duì)如何調(diào)試這個(gè)程序提建議。我建議用 quartz 這樣的成熟框架來(lái)做這類事情。如果一定要自己設(shè)計(jì)的話,Timer 也不是最好的選擇,標(biāo)準(zhǔn)的思路應(yīng)該是:
創(chuàng)建一個(gè)守護(hù)線程,管理每個(gè)定時(shí)任務(wù)的周期;
當(dāng)一個(gè)定時(shí)任務(wù)執(zhí)行時(shí)間到了,守護(hù)線程另開(kāi)一個(gè)線程執(zhí)行這個(gè)任務(wù);
如果一個(gè)任務(wù)執(zhí)行時(shí)間超過(guò)周期,則推遲下次執(zhí)行時(shí)間到下一個(gè)周期。
相關(guān)文章:
1. 怎么在網(wǎng)頁(yè)中設(shè)置圖片進(jìn)行左右滑動(dòng)2. shell - Update query wrong in MySQL3. javascript - 新浪微博網(wǎng)頁(yè)版的字?jǐn)?shù)限制是怎么做的4. node.js - mysql如何通過(guò)knex查詢今天和七天內(nèi)的匯總數(shù)據(jù)5. mysql 插入數(shù)值到特定的列一直失敗6. Python從URL中提取域名7. 360瀏覽器與IE瀏覽器有何區(qū)別???8. javascript - 用jsonp抓取qq音樂(lè)總是說(shuō)回調(diào)函數(shù)沒(méi)有定義9. python - 在使用Pycharm時(shí)經(jīng)常看到如下的樣式,小括號(hào)里紅色的部分是什么意思呢?10. python 合并dict
