Java计时器Timer中schedule方法和scheduleAtFixedRate方法的区别

Java计时器Timer中schedule方法和scheduleAtFixedRate方法的区别概述schedule关注执行间隔(大混子),scheduleAtFixedRate关注执行时间(守信的人)。例子schedule(task,1000L,2000L)1秒后开始执行task线程,循环:每过2秒执行一次。scheduleAtFixedRate(task,1000L,

大家好,欢迎来到IT知识分享网。

概述

schedule关注执行间隔(大混子),scheduleAtFixedRate关注执行时间(守信的人)。

例子

schedule( task ,1000L ,2000L)           1秒后开始执行task线程,循环:每过2秒执行一次。

scheduleAtFixedRate( task ,1000L ,2000L)       1秒后开始执行task线程,循环:每过2秒执行一次。

public class LeaningThread {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("mm:ss");
        System.out.println("main程序开始执行,现在时间是:"+df.format(new Date()));
        
        Test task = new Test();
        Timer tm = new Timer();
        //第x秒开始执行,x+2,x+4,x+8,...
        tm.schedule(task,1000,2000);//1秒后开始执行task线程,循环:每过2秒执行一次。
        //tm.scheduleAtFixedRate(task,1000,2000);//1秒后开始执行task线程,循环:每过2秒执行一次。
    }
}

 

令task线程前3次执行,分别需要3秒,从第4次开始,执行一次只需要一下下。

//继承抽象父类TimerTask
class Test extends TimerTask{
    static  int number=3;//前3次执行的时候,线程睡3秒
    static int count=0;//第几次执行

    @Override
    public void run() {
        SimpleDateFormat df = new SimpleDateFormat("mm:ss");
        System.out.println("线程第"+(++count)+"次执行");
        System.out.println("线程开始执行,现在时间是:"+df.format(new Date()));

        //前三次睡三秒
        if(0<number--){
            try {
                System.out.println("线程执行三秒");
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else {
            System.out.println("线程执行只需一瞬间");
        }
        System.out.println("---------end-----------");
    }
}

schedule运行分析

程序执行的时间是第44秒,理论上它设计的执行时间为:45,47,49,51,53,55,57,……

但是第三次运行结结束(因为距离第三次运行早就过了2秒,第四次执行直接开始)已经是54秒,为了保证每隔两秒执行一次,它把第五次运行放在第56秒,以此类推,无视设计规则。

Java计时器Timer中schedule方法和scheduleAtFixedRate方法的区别

scheduleAtFixedRate运行分析

程序执行的时间是第37秒,理论上它设计的执行时间为:38,40,42,44,46,48,50…….

但是第三次结束(第四次直接开始运行)的时候已经47了,为了保证第六次执行在第48秒,它急速把之前落下来的第4次、第5次线程执行完了,并且在第48秒开始第6次执行。

(没有意外的话,它一定做到约定,就算出了意外,等意外过去了,它还是会想办法做到约定,真的,好守信!!!!我哭死)

Java计时器Timer中schedule方法和scheduleAtFixedRate方法的区别

总结:

schedule关注执行间隔(大混子),不关注计划(规则)。

scheduleAtFixedRate关注执行时间(守信的人),关注计划(规则)。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30239.html

(0)
上一篇 2023-10-17 17:45
下一篇 2023-10-18 20:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信