zoukankan      html  css  js  c++  java
  • 定时任务-Timer

    Timer类的全限定名

      java.util.Timer

    java.util.Timer类的构造函数

    public Timer();
    
    public Timer(boolean isDaemon);
    
    public Timer(String name);
    
    public Timer(String name, boolean isDaemon);

    java.util.Timer类提供的创建定时任务的方法

    /**
     * 延迟delay毫秒后执行任务task。
     *
     * @param task      任务
     * @param delay     延迟时间
     */
    public void schedule(TimerTask task, long delay);
    
    /**
     * 在指定时间time执行任务task,如果时间已过,就立即执行。
     *
     * @param task      任务
     * @param time      计划执行任务的时间
     */
    public void schedule(TimerTask task, Date time);
    
    /**
     * 延迟delay毫秒后执行第一次任务,之后每过period毫秒执行一次。
     *
     * 假设:
     *      执行一次任务需要消耗的时间为 exeTime
     *      执行此次任务的开始时间是 nowTime
     *      执行下一次任务的预期时间是 expectTime
     *      执行下一次任务的实际时间是 actuallyTime
     * 如果 exeTime >= period ,那么,expectTime == nowTime + exeTime; actuallyTime >= expectTime;
     * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= expectTime;
     *
     * @param task      任务
     * @param delay     执行首次任务的延迟时间
     * @param period    后续周期性执行任务的时间间隔
     */
    public void schedule(TimerTask task, long delay, long period);
    
    /**
     * 在指定的时间firstTime执行第一次任务,之后每过period毫秒执行一次。
     *
     * 如果首次执行任务的时间firstTime已过,则立即执行一次首次任务。
     *
     * 假设:
     *      执行一次任务需要消耗的时间为 exeTime
     *      执行此次任务的开始时间是 nowTime
     *      执行下一次任务的预期时间是 expectTime
     *      执行下一次任务的实际时间是 actuallyTime
     * 如果 exeTime >= period ,那么,expectTime == nowTime + exeTime; actuallyTime >= nowTime + exeTime;
     * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= nowTime + period;
     *
     * @param task      任务
     * @param firstTime 计划执行首次任务的时间
     * @param period    后续周期性执行任务的时间间隔
     */
    public void schedule(TimerTask task, Date firstTime, long period);
    
    /**
     * 延迟delay毫秒后执行第一次任务,之后每过period毫秒执行一次。
     *
     * 假设:
     *      执行一次任务需要消耗的时间为 exeTime
     *      执行此次任务的开始时间是 nowTime
     *      执行下一次任务的预期时间是 expectTime
     *      执行下一次任务的实际时间是 actuallyTime
     * 如果 exeTime >= period ,那么,expectTime == nowTime + period; actuallyTime >= nowTime + exeTime;
     * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= nowTime + period;
     *
     * @param task      任务
     * @param delay     执行首次任务的延迟时间
     * @param period    后续周期性执行任务的时间间隔
     */
    public void scheduleAtFixedRate(TimerTask task, long delay, long period);
    
    /**
     * 在指定的时间firstTime执行第一次任务,之后每过period毫秒执行一次。
     *
     * 如果首次执行任务的时间已过,则立即执行之前应当执行的所有任务(1+N)。
     *
     * 假设:
     *      执行一次任务需要消耗的时间为 exeTime
     *      执行此次任务的开始时间是 nowTime
     *      执行下一次任务的预期时间是 expectTime
     *      执行下一次任务的实际时间是 actuallyTime
     * 如果 exeTime >= period ,那么,expectTime == nowTime + period; actuallyTime >= nowTime + exeTime;
     * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= nowTime + period;
     *
     * @param task      任务
     * @param firstTime 计划执行首次任务的时间
     * @param period    后续周期性执行任务的时间间隔
     */
    public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period);

    创建定时任务的示例

    示例一:延迟执行任务

    package com.java.scheduled.task.timer;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class ScheduledTaskDemo01 {
    
        public static void main(String[] args) {
    
            Timer timer = new Timer("timer01");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            long c1 = System.currentTimeMillis();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    Date nowDate = new Date();
                    System.out.println("--------------------------------------------------------------------------------");
                    long delayTime = nowDate.getTime() - c1;
                    System.out.println("计划任务(1):【延迟2秒执行】");
                    System.out.println("实际执行任务的时间:"+sdf.format(nowDate)+",延迟时间:"+delayTime +"ms");
                }
            } , 2000);
    
        }
    
    }

    执行结果如下:

    --------------------------------------------------------------------------------
    计划任务(1):【延迟2秒执行】
    实际执行任务的时间:2019-05-28 01:14:13,延迟时间:2000ms

    示例二:在指定时间执行任务

    package com.java.scheduled.task.timer;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class ScheduledTaskDemo02 {
    
        public static void main(String[] args) {
    
            Timer timer = new Timer("timer02");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date planExecuteTime = null;
            try {
                planExecuteTime = sdf.parse("2019-05-27 23:58:00");
            } catch (ParseException pe) {
                pe.printStackTrace();
            }
            Date date = new Date();
            System.out.println("--------------------------------------------------------------------------------");
            System.out.println("安排执行任务的时间:"+sdf.format(date));
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    Date nowDate = new Date();
                    System.out.println("计划任务(2):【于2019-05-27 23:58:00执行任务】");
                    System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime())));
                    System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
                }
            }, planExecuteTime);
    
        }
    
    }

    执行结果如下:

    --------------------------------------------------------------------------------
    安排执行任务的时间:2019-05-28 01:20:16
    计划任务(2):【于2019-05-27 23:58:00执行任务】
    ****预期执行任务的时间:2019-05-27 23:58:00
    ****实际执行任务的时间:2019-05-28 01:20:16

    示例三:延迟+周期性执行任务

    package com.java.scheduled.task.timer;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class ScheduledTaskDemo03 {
    
        public static void main(String[] args) {
    
            Timer timer = new Timer("timer03");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            long c2 = System.currentTimeMillis();
            Date date = new Date();
            System.out.println("安排执行任务的时间:"+sdf.format(date));
            timer.schedule(new TimerTask() {
                long exeTime = c2;
                @Override
                public void run() {
                    Date nowDate = new Date();
                    System.out.println("--------------------------------------------------------------------------------");
                    System.out.println("计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】");
                    System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime())));
                    System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
                    System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {}
                    exeTime = nowDate.getTime();
                }
            }, 1000, 2000);
    
        }
    
    }

    执行结果如下:

    安排执行任务的时间:2019-05-28 12:21:49
    --------------------------------------------------------------------------------
    计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:21:50
    ****实际执行任务的时间:2019-05-28 12:21:50
    ****距离上次执行任务的时间间隔:1000ms
    --------------------------------------------------------------------------------
    计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:21:53
    ****实际执行任务的时间:2019-05-28 12:21:53
    ****距离上次执行任务的时间间隔:3001ms
    --------------------------------------------------------------------------------
    计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:21:56
    ****实际执行任务的时间:2019-05-28 12:21:56
    ****距离上次执行任务的时间间隔:3000ms
    --------------------------------------------------------------------------------
    计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:21:59
    ****实际执行任务的时间:2019-05-28 12:21:59
    ****距离上次执行任务的时间间隔:3002ms

    示例四:定时+周期性执行任务

    package com.java.scheduled.task.timer;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class ScheduledTaskDemo04 {
    
        public static void main(String[] args) {
    
            Timer timer = new Timer("timer04");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date planExecuteTime = null;
            long c3 = System.currentTimeMillis();
            try {
                planExecuteTime = sdf.parse("2019-05-28 00:23:00");
            } catch (ParseException pe) {
                pe.printStackTrace();
            }
            Date date = new Date();
            System.out.println("安排执行任务的时间:"+sdf.format(date));
            timer.schedule(new TimerTask() {
                long exeTime = c3;
                @Override
                public void run() {
                    Date nowDate = new Date();
                    System.out.println("--------------------------------------------------------------------------------");
                    System.out.println("计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】");
                    System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime())));
                    System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
                    System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {}
                    exeTime = nowDate.getTime();
                }
            }, planExecuteTime, 2000);
    
        }
    
    }

    执行结果如下:

    安排执行任务的时间:2019-05-28 12:23:17
    --------------------------------------------------------------------------------
    计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:23:17
    ****实际执行任务的时间:2019-05-28 12:23:17
    ****距离上次执行任务的时间间隔:4ms
    --------------------------------------------------------------------------------
    计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:23:20
    ****实际执行任务的时间:2019-05-28 12:23:20
    ****距离上次执行任务的时间间隔:3002ms
    --------------------------------------------------------------------------------
    计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:23:23
    ****实际执行任务的时间:2019-05-28 12:23:23
    ****距离上次执行任务的时间间隔:3001ms
    --------------------------------------------------------------------------------
    计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:23:26
    ****实际执行任务的时间:2019-05-28 12:23:26
    ****距离上次执行任务的时间间隔:3002ms

    示例五:延迟+周期性执行任务

    package com.java.scheduled.task.timer;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class ScheduledTaskDemo05 {
    
        public static void main(String[] args) {
            Timer timer = new Timer("timer05");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            System.out.println("安排执行任务的时间:"+sdf.format(date));
            long c2 = date.getTime();
            timer.scheduleAtFixedRate(new TimerTask() {
                long exeTime = c2;
                @Override
                public void run() {
                    Date nowDate = new Date();
                    System.out.println("--------------------------------------------------------------------------------");
                    System.out.println("计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】");
                    System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime())));
                    System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
                    System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {}
                    exeTime = nowDate.getTime();
                }
            }, 1000, 2000);
        }
    
    }

    执行结果如下:

    安排执行任务的时间:2019-05-28 12:24:29
    --------------------------------------------------------------------------------
    计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:24:30
    ****实际执行任务的时间:2019-05-28 12:24:30
    ****距离上次执行任务的时间间隔:1001ms
    --------------------------------------------------------------------------------
    计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:24:32
    ****实际执行任务的时间:2019-05-28 12:24:33
    ****距离上次执行任务的时间间隔:3003ms
    --------------------------------------------------------------------------------
    计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:24:34
    ****实际执行任务的时间:2019-05-28 12:24:36
    ****距离上次执行任务的时间间隔:3002ms
    --------------------------------------------------------------------------------
    计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:24:36
    ****实际执行任务的时间:2019-05-28 12:24:39
    ****距离上次执行任务的时间间隔:3002ms

    示例六:定时+周期性执行任务

    package com.java.scheduled.task.timer;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class ScheduledTaskDemo06 {
    
        public static void main(String[] args) {
            Timer timer = new Timer("timer06");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date planExecuteTime = null;
            try {
                planExecuteTime = sdf.parse("2019-05-28 00:23:00");
            } catch (ParseException pe) {
                pe.printStackTrace();
            }
            Date date = new Date();
            System.out.println("安排执行任务的时间:"+sdf.format(date));
            long c3 = date.getTime();
            timer.scheduleAtFixedRate(new TimerTask() {
                long exeTime = c3;
                @Override
                public void run() {
                    Date nowDate = new Date();
                    System.out.println("--------------------------------------------------------------------------------");
                    System.out.println("计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】");
                    System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime())));
                    System.out.println("****实际执行任务的时间:"+sdf.format(nowDate));
                    System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {}
                    exeTime = nowDate.getTime();
                }
            }, planExecuteTime, 2000);
        }
    
    }

    执行结果如下:

    安排执行任务的时间:2019-05-28 12:32:44
    --------------------------------------------------------------------------------
    计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:33:00
    ****实际执行任务的时间:2019-05-28 12:33:00
    ****距离上次执行任务的时间间隔:15482ms
    --------------------------------------------------------------------------------
    计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:33:02
    ****实际执行任务的时间:2019-05-28 12:33:03
    ****距离上次执行任务的时间间隔:3004ms
    --------------------------------------------------------------------------------
    计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:33:04
    ****实际执行任务的时间:2019-05-28 12:33:06
    ****距离上次执行任务的时间间隔:3001ms
    --------------------------------------------------------------------------------
    计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:33:06
    ****实际执行任务的时间:2019-05-28 12:33:09
    ****距离上次执行任务的时间间隔:3000ms
    --------------------------------------------------------------------------------
    计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】
    ****预期执行任务的时间:2019-05-28 12:33:08
    ****实际执行任务的时间:2019-05-28 12:33:12
    ****距离上次执行任务的时间间隔:3001ms
  • 相关阅读:
    家庭记账本安卓版开发:第六天
    django-自定义过滤器
    django-标签语法
    django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
    django-MTV基础篇
    django-第一天
    jquery---响应式方面应用
    css-基础知识
    HTML--第一章的基本知识
    003
  • 原文地址:https://www.cnblogs.com/517cn/p/10934775.html
Copyright © 2011-2022 走看看