温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Timer如何实现自定义时间间隔的连环炸

发布时间:2022-01-11 10:21:38 来源:亿速云 阅读:135 作者:iii 栏目:编程语言

这篇文章主要介绍“Timer如何实现自定义时间间隔的连环炸”,在日常操作中,相信很多人在Timer如何实现自定义时间间隔的连环炸问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Timer如何实现自定义时间间隔的连环炸”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

传统线程技术中有个定时器,定时器的类是 Timer,我们使用定时器的目的就是给它安排任务,让它在指定的时间完成任务。所以先来看一下 Timer 类中的方法(主要看常用的 TimerTask() 方法):

返回值方法名方法描述
voidschedule(TimerTasktask,longdelay)安排在指定延迟后执行指定的任务。
voidschedule(TimerTasktask,longdelay,longperiod)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
voidschedule(TimerTasktask,Datetime)安排在指定的时间执行指定的任务
voidschedule(TimerTasktask,DatefirstTime,longperiod)安排指定的任务在指定的时间开始进行重复的固定延迟执行。

前面两个是在指定延迟后执行或者重复执行,后面两个是在指定时间执行或者重复执行。我们以前两个为例来研究一下定时器的使用。先写一个简单的使用定时器的 demo,然后慢慢引申。

public class TraditionalTimer {
    public static void main(String[] args) {
        //简单定时器的demo
        new Timer().schedule(new TimerTask() {          
            @Override
            public void run() {
                //实际中会扔一个对象进来,我们就可以在这里操作这个对象的所有方法了
                System.out.println("--boom--");//爆炸
            }
        }, 2000,3000); 
        //打印秒钟,一秒输出一次,用来方便观察的
        while(true) {
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

我们用匿名内部类来定义了一个 TimerTask 对象,需要重写 run() 方法,然后运行这个程序,可以看出来第一次2秒钟后打印 “--boom--,后面每隔3秒打印一次。
我们也可以自己来实现上面这个重复执行,我们用定时器的 “连环套”!也就是定时器中再套定时器,一个定时器任务执行完了,在任务的最后再装一个定时器。那么我们需要先定义一个自己的定时器任务,在自己的定时器任务中再装一个定时器,把自定义的定时器任务扔进去。然后我们开启定时器的时候把自己定义的定时器任务扔进去即可。如下:

public class TraditionalTimer {
    public static void main(String[] args) {
        //自定义一个定时器任务
        class MyTimerTask extends TimerTask {           
            @Override
            public void run() {
                System.out.println("--boom--");
                //任务执行完再装一个定时器,扔进自定义的定时器任务
                new Timer().schedule(new MyTimerTask(), 3000);
            }
        }
        new Timer().schedule(new MyTimerTask(), 2000);//外面开启定时器
        while(true) {//打印秒钟,一秒输出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

这样的话,我们通过定时器的 “连环套” 很轻松的实现了连环爆炸。但是现在问题来了,上面提供的方法中重复执行都是每隔固定的时间,如果我想要隔2秒执行一次,再隔4秒执行一次,再隔2秒执行一次,再隔4秒执行一次……这该如何实现呢?
可以这样,我们定义一个全局的私有成员变量来记录爆炸次数,奇数的时候隔2秒炸,偶数的次数的话隔4秒炸,或者反过来也行,修改如下:

public class TraditionalTimer {
    private static int count = 0; //记录爆炸的次数
    public static void main(String[] args) {    
        class MyTimerTask extends TimerTask {           
            @Override
            public void run() {
                count = (count + 1) % 2; //结果只有0和1
                System.out.println("--boom--");
                                //根据count结果设定新的定时时间
                new Timer().schedule(new MyTimerTask(), 2000+2000*count);
            }
        }
        new Timer().schedule(new MyTimerTask(), 2000);
        while(true) {//打印秒钟,一秒输出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

这样的话,我们就实现了自定义爆炸间隔了。上面这个是通过定义一个全局私有变量来实现,其实我们也可以这么干:不是要实现两个不同时间间隔的连环炸么?我可以定义两个定时器任务A和B,在A执行完开启定时器,把B任务装进去,B执行完开启定时器把A装进去,这样也可以。如下:

public class TraditionalTimer {
    public static void main(String[] args) {
        new Timer().schedule(new MyTimerTaskA(), 2000);//A和B随便开一个
        while(true) {//打印秒钟,一秒输出一次
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
//自定义两个定时器任务类,继承TimerTask即可
class MyTimerTaskA extends TimerTask {
    @Override
    public void run() {
        System.out.println("--boomA--");
        new Timer().schedule(new MyTimerTaskB(), 4000);
    }           
}
class MyTimerTaskB extends TimerTask {
    @Override
    public void run() {
        System.out.println("--boomB--");
        new Timer().schedule(new MyTimerTaskA(), 2000);
    }   
}

到此,关于“Timer如何实现自定义时间间隔的连环炸”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI