Heim  >  Fragen und Antworten  >  Hauptteil

java - TimerTask wurde nicht vollständig ausgeführt

Ich habe eine TimerManager-Klasse erstellt, damit das System die entsprechenden vier Aufgaben ausführen kann, nachdem es ausgeführt wurde. Allerdings wurden nur zwei der vier Aufgaben erfolgreich ausgeführt, nämlich Timer und Timer3, und die folgenden beiden Aufgaben, Timer2 und Timer4, wurden nicht ausgeführt. Ich kann es nicht herausfinden, also bin ich zu SF gekommen und habe Sie gebeten, mir dabei zu helfen, das Problem herauszufinden:

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解析信息发生异常--------------");
            }
        }
    }
}
世界只因有你世界只因有你2669 Tage vor892

Antworte allen(1)Ich werde antworten

  • 仅有的幸福

    仅有的幸福2017-06-28 09:26:54

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

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

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

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

    Antwort
    0
  • StornierenAntwort