• Timer和TimerTask定时器使用


    Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
    TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。具体的任务在TimerTask中run接口中实现。
    通过Timer中的schedule方法启动定时任务。

    一、运行定时器
    启动一个定时器实质是启动一个线程
    1、在指定日期运行定时器任务,只运行一次

    public static void main(String[] args) throws ParseException {
        String sdate = "2018-02-14";
        SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd");
        Date date = sf.parse(sdate);
    
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
    
        @Override
            public void run() {
                System.out.println("系统正在运行……");
            }
        }, date); //在指定的日期运行一次定时任务
    /*如果date日期在今天之前,则启动定时器后,立即运行一次定时任务run方法*/
    /*如果date日期在今天之后,则启动定时器后,会在指定的将来日期运行一次任务run方法*/
    }                        


    2、在距当前时刻的一段时间后运行定时器任务,只运行一次

    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
    
            @Override
            public void run() {
                System.out.println("系统正在运行……");
            }
        }, 5000); //指定启动定时器5s之后运行定时器任务run方法,并且只运行一次
    }    

    3、在指定的时间后,每隔指定的时间,重复运行定时器任务

     1 public static void main(String[] args) throws ParseException {
     2     String sdate = "2018-02-10";
     3     SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd");
     4     Date date = sf.parse(sdate);
     5 
     6     Timer timer = new Timer();
     7     timer.schedule(new TimerTask() {
     8 
     9         @Override
    10         public void run() {
    11             System.out.println("系统正在运行……");
    12         }
    13     }, date, 2000);
    14 /*如果指定的date时间是当天或者今天之前,启动定时器后会立即每隔2s运行一次定时器任务*/
    15 /*如果指定的date时间是未来的某天,启动定时器后会在未来的那天开始,每隔2s执行一次定时器任务*/
    16 }    

    4、在距当前时刻的一段指定距离后,每隔指定时间运行一次定时器任务

    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
    
            @Override
            public void run() {
                System.out.println("系统正在运行……");
            }
        }, 5000, 2000);
    /*当启动定时器后,5s之后开始每隔2s执行一次定时器任务*/
    }


    二、停止定时器
    停止定时器实质是终止Timer的线程。默认情况下,创建的Timer线程会一直执行,如果要停止的话主要有以下四种方法终止Timer线程:

    调用Timer的cancel方法;
    把Timer线程设置成Daemon守护线程,当所有的用户线程结束后,那么守护线程也会被终止;
    当所有的任务执行结束后,删除对应Timer对象的引用,线程也会被终止;
    调用System.exit方法终止程序

    举例用cancel方法终止Timer线程

    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
    
            @Override
            public void run() {
                System.out.println("系统正在运行……");
                // timer.cancel(); //可以在任何时刻调用cancel方法终止timer线程
            }
        }, 5000, 2000);
    
        /*如果主线程不休眠一段时间,就执行了cancel方法,那么定时器还没来得及执行就会被关闭*/
        Thread.sleep(6000);
        timer.cancel();
    }

    三、启动任务schedule 与 scheduleAtFixedRate的区别
    1、schedule

    public static void main(String[] args) throws ParseException {
            SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
            Date date = sf.parse("2018-02-12 18:33:00");
    
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
    
                @Override
                public void run() {
                    System.out.println(new Date() + "系统正在运行……");
                }
            }, date, 10 * 1000);
    
        }

    2、scheduleAtFixedRate

     1 public static void main(String[] args) throws ParseException {
     2         SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
     3         Date date = sf.parse("2018-02-12 18:39:00");
     4 
     5         Timer timer = new Timer();
     6         timer.scheduleAtFixedRate(new TimerTask() {
     7 
     8             @Override
     9             public void run() {
    10                 System.out.println(new Date() + "系统正在运行……");
    11             }
    12         }, date, 10 * 1000);
    13     }
  • 相关阅读:
    word文档中画垂直或水平的线条
    word文档中把几个图形组合在一起
    设计模式
    确认删除的提示的JQuery
    Incorrect column count: expected 1, actual 4 问题
    Spring MVC 中的 controller层的方法的返回值类型
    SpringBoot 项目用户登录
    使用模板异常的解决
    Redis配置到本地以及可视化工具的安装运用
    第034讲:丰富的else语句及简洁的with语句 | 课后测试题及答案
  • 原文地址:https://www.cnblogs.com/carsonwuu/p/10405802.html
Copyright © 2020-2023  润新知