Java定时器

宁波box箱体项目中需要软件能够每天定时开关投影机并播放片子,其中最关键的实现是定时器的逻辑,在网上找了找,终于找到一篇能够对我有帮助的定时器写法。

在项目中我封装成了一个特定的方法,只需要传入特定的时分和操作类型就可以达到定时执行指定操作的功能。

    /**
     * 根据指定时-分控制所有设备
     * @author mht
     * @param hour
     * @param min
     */
    public void ctrlAllInGivenTime(Integer hour, Integer min, String operate){
        Timer timer = new Timer();//新建Timer类
        Calendar cal = Calendar.getInstance();
        // 每天定点执行
        cal.set(Calendar.HOUR_OF_DAY, hour);
        cal.set(Calendar.MINUTE, min);
        cal.set(Calendar.SECOND, 0);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info("总控自动定时操作:" + operate + ",定时器首次执行时间:" + df.format(cal.getTime()));
        timer.schedule(new TimerTask() {//每天执行输出时间
            @Override
            public void run() {
                if (StatusPublish.getFlag()){
                    logger.info("定时自动开关机操作准备就绪...");
                    if ("off".equals(operate)) {
                        //调用关闭player的控制方法,在总控设备中的关主机的方法可能有重复,不过没关系
                        ctrlPlayer("close#");
                        try {
                            Thread.sleep(StatusPublish.getHostclose() * 1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //全开-全关设备
                    ctrlAllLight("all", operate);//开机操作
                    logger.info("ctrlAllLight方法已执行操作:" + operate);
                    logger.info("自动总控操作:" + operate + "最近一次执行时间:" + df.format(new Date()));
                }
            }
        }, cal.getTime(), 24 * 60 * 60 * 1000);
    }
代码的实现逻辑如上,其中起到关键作用的就是timer的任务逻辑。

Timer是 java.util 中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。而TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。

程序中实现的是反复执行操作,调用的是三个参数的schedule方法,第二个参数是第一次执行的时间,第三个参数是隔多久执行一次(单位毫秒)。

另外值得一提的是另一个有趣的方法scheduleAtFixedRate,这个方法的用意是严格按照指定时间来执行,而调整时间间隔,也就是说如果某一次的定时执行任务时间过长,导致后续任务延后的话,就会造成后面的执行时间偏移我们预期的执行时间越来越远,所以,如果是要每天正点执行任务的话,可以考虑使用这种方式来安排任务。

=====2018/2/23更新======

在使用定时器定时更新微信公众号的access_token的时候,使用了void java.util.Timer.schedule(TimerTask task, long delay)方法,注意与前面代码之间的区别!!注意此方法没有第三个参数,也就是说,方法只会执行一次而不会循环执行,所以两个参数的时候方法默认第二个参数不是循环间隔,而是延迟执行的时间,所以此方法在等待delay的时间之后只会执行一次



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值