java - TimerTask tidak semuanya berjaya dilaksanakan
世界只因有你
世界只因有你 2017-06-28 09:24:54
0
1
946

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

membalas semua(1)
仅有的幸福

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:

  1. Buat benang daemon untuk menguruskan kitaran setiap tugas yang dijadualkan

  2. Apabila masa pelaksanaan tugas yang dijadualkan tamat, benang daemon membuka satu lagi urutan untuk melaksanakan tugasan

  3. Jika masa pelaksanaan tugas melebihi kitaran, masa pelaksanaan seterusnya akan ditangguhkan ke kitaran seterusnya.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan