java - 定时任务TimerTask没有被全部成功执行
世界只因有你
世界只因有你 2017-06-28 09:24:54
0
1
889

我这建立了一个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解析信息发生异常--------------");
            }
        }
    }
}
世界只因有你
世界只因有你

全部回复(1)
仅有的幸福

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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!