定时任务-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

 

posted @ 2019-05-28 01:31  狱婪  阅读(255)  评论(0编辑  收藏  举报