• 【java】定时器


    总结

    1、执行计划的任务放在TimerTask的子类中,由Timer进行该任务。

    2、创建一个Timer就是启动一个新的线程,直至Timer里的任务执行完毕,才会结束。希望创建的线程为守护线程,则创建时需设置Timer timer=new Timer(true);

    3、执行任务的时间早于当前时间,任务会立即执行。

    4、TimerTask是以队列的方式一个个顺序执行的。当前面的任务消耗时间较长,则后面的任务运行的时间也会延后。

    比如,假定Task1执行需2s,Task2在Task1开始之后1s需被执行。结果是执行完Task1后,立即执行Task2。(实际也符合第3点)

    5、如果没有延迟,则执行任务的时间是上一次任务开始的时间加上poried的时间。如果延迟了,则执行任务的时间为上一个任务的结束时间。(补充第4条)

    6、方法schedule和scheduleAtFixedRate的区别在于后者有追赶执行性。(下面由代码解释)

    7、异常方面。如果timer中执行任务时发生异常,则结束该timer线程,不会在执行任何任务。

    常用例子

    1、示例

    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    /**
     * Created by zay on 2016/12/8.
     */
    
    public class TimerTest {
        public static void main(String[] args) {
            System.out.println("当前时间:"+new Date());
    
            //执行计划的任务放在TimerTask的子类中,由Timer进行该任务。
            Timer timer = new Timer();
    
            //创建一个任务,1s后开始执行,并此后每隔2s执行。
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println(new Date() + "任务一");
                }
            },1000,2000);
    
            //创建一个任务,十天后执行。
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE,1);
            Date runDate = calendar.getTime();
    
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println(new Date() + "任务二");
                }
            },runDate);
            
            //timer.cancel();  调用TImer的cancel()方法会清空该TImer的所有任务。
            //timerTask.cancel();  调用TImerTask的cancel()方法则会在TImer中取消该任务。
        }
    }
    
    

     2、方法schedule和scheduleAtFixedRate的区别在于后者有追赶执行性。

    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**
     * Created by zay on 2016/12/8.
     */
    public class TimerTest {
        public static void main(String[] args) {
            System.out.println("当前时间:"+new Date());
    
            Calendar calendar=Calendar.getInstance();
            calendar.add(Calendar.SECOND,-100);   //设置一个比较早的时间
            Date earlyDate = calendar.getTime();
    
            Timer timer = new Timer();
            System.out.printf(new Date() + " 现在开始执行任务");
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    System.out.println(new Date() + " 任务一");
                }
            },earlyDate,5000);
    
            /*timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println(new Date() + " 任务一");
                }
            },earlyDate,5000);*/
    
        }
    }

    // schedule方法的输出(注意比对执行任务的时间)                //scheduleAtFixedRate方法的输出

         

    解释:当执行任务的时间早于当前时间时,比如示例中,执行任务的时间早于当前任务100s,那么这段时间理论应该有的任务怎么处理呢?

    schedule选择抛弃不理,以当前的时间为新的起点,而scheduleAtFiexdRate则会一口气将这些任务顺序都执行完毕。

  • 相关阅读:
    vector
    codeforces 1453D. Checkpoints
    [ICPC2019 WF]Hobson's Trains
    [ICPC2019 WF]Circular DNA
    计算几何板子
    CSP-S2020 贪吃蛇(洛谷民间数据)
    CSP-S2020 函数调用(洛谷民间数据)
    [NOI Online #3 提高组]魔法值
    [NOI Online #1 提高组]冒泡排序
    佳能m62套机5500 佳能EOS M50 M6 MARK2 II二代 最低到过5800
  • 原文地址:https://www.cnblogs.com/zadomn0920/p/java.html
Copyright © 2020-2023  润新知