启动应用后,定时执行的定时器就立即执行是怎么回事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动应用后,定时执行的定时器就立即执行是怎么回事相关的知识,希望对你有一定的参考价值。

我用Calendar 设置的是每天的7:30执行,用的是timer.schedule(task, date, period); 为什么现在我只要启动应用,task里面的方法就立即执行?我只想让它在每天的7:30执行。

参考技术A 你是不是设置成今天的7:30了,如果设置的时间早于当前时间,那么任务会立即执行。 参考技术B 检查有没有rt118,1的指令检查有没有重复使用t118的定时器指令

定时器和延时器(利用定时器制作倒计时)

一、延时器(setTimeout)
1.延时器(setTimeout)的工作方式是:当设定一个延时器是5s后进行时,并不代表它5s后就立即执行,只是代表它5s后会被加入队列,如果5s后,队列没有其他东西,那么延时器的代码会立即执行,否则会延迟执行。

因此,关于延时器最重要的一点是:指定的时间间隔(如设置5s后执行),表示何时将延时器加入到队列,而不是何时真正执行代码。

 

二、定时器(setInterval)
1.定时器的一大特点是每隔一段时间(如每隔2s)就会执行,一直重复。这样有个问题:设定一个定时器a每隔2s执行一次,如果a执行的时间(executiveTime)大于时间间隔(2s),那么,第一次执行的a还没执行完第一次,就开始执行第二次了。

js巧妙地避免了这个问题——即等到定时器的代码执行完后,再去将定时器的代码加入到队列中,所以定时器代码加入队列的最小时间间隔即指定间隔(因为理想状态是是定时器的执行时间在时间间隔内完成)。

2.使用setInterval的问题
(1)某些间隔会被跳过——如设置每个1s执行一次,如果该定时器代码执行时间大于1s,或者正好等于1s,那么,相当于代码执行时间正好等于间隔时间,那么,这个间隔时间就被执行时间占据了,所以就没有了间隔时间即没有间隔。


利用定时器制作一个倒计时功能,有开始、暂停、继续、复位功能。
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
        #contentdisplay: block;width: 200px;height: 200px;border: 1px solid black;margin: 20px auto;text-align: center;line-height: 200px;font-size: 50px;
        #btnwidth: 200px;height: 40px;border: 1px solid black;border-radius: 10px;margin: 20px auto;display: block;cursor: pointer;background: blue;color: #FFFFFF;font-size: 25px;
    </style>
</head>
<body>
    <span id="content">
        100
    </span>
    <input type="button" id="btn" value="开始">//定义一个功能按钮
    <script>
        var ocontent = document.getElementById("content");
        var obtn = document.getElementById("btn");
        var start = ocontent.innerHTML;
        var num = ocontent.innerHTML;
        var timer = null;  //设置全局变量
        var onoff = 1;  //开关
        obtn.onclick = function()
            if(onoff == 1)  //当开关等于1时,执行开始倒计时功能
                clearInterval(timer);  //清除计时器,避免重复点击开关时,造成bug
                timer=setInterval(function()
                    if(num == 1)
                        num = "结束了"
                        obtn.value="复位"
                        clearInterval(timer);
                        onoff = 2;
                    else                        
                        num--;
                    
                    ocontent.innerHTML = num;
                ,100)
                onoff =0;  //“定义”到暂停的功能
                obtn.value = "暂停"  //点击按钮时,obtn.value变为暂停
            else if(onoff == 0)  //暂停功能
                clearInterval(timer);
                onoff = 1;  //暂停之后继续倒计时
                obtn.value = "继续"    //obtn.value变为继续
            else if(onoff == 2)  //启动复位功能
                obtn.value = "开始";
                onoff = 1;
                num = start;
                ocontent.innerHTML = start;
            
        
    </script>    
</body>
</html>

效果如下:

技术图片

以上是关于启动应用后,定时执行的定时器就立即执行是怎么回事的主要内容,如果未能解决你的问题,请参考以下文章

java定时器 每天凌晨 固定执行一个方法

js中定时器setTimeout函数的问题?

js定时器每秒执行一次,为啥时间会不准?

怎么样启动计划任务让电脑定时关机

quartz有两个定时任务,当第二个影响到第一个时,怎么处理

qprocess执行 scp不弹密码框怎么回事