Timer定时任务调度Api及优缺点

Timer是java.util自带的类,该类可以完成定时任务调度功能,但是只有一个后台线程,所以不支持并发,而且当遇到运行时错误的时候会停止所有正在执行的任务。Quartz可以说是大哥,改善了这两大缺陷。

Timer Api接口介绍:

Timer定时任务调度Api及优缺点_第1张图片

1.schedule(TimerTask,Date)是在计划的时间点执行一次。

实验一把:

先自定义一个TimerTask类

package com.hbk.test;

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask{

    @Override
    public void run() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(scheduledExecutionTime()));// 打印任务真正执行时间
    }
}

测试类:

package com.hbk.test;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;

public class Test {
    public static void main(String[] args) {
        Timer timer = new Timer();
        MyTimerTask timeTask = new MyTimerTask();
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is " + df.format(calendar.getTime()));
        timer.schedule(timeTask, calendar.getTime());
    }
}

执行结果:

current time is 2018-01-03 09:36:23
2018-01-03 09:36:23

2.Timer.schedule(TimerTask task, long delay)

延迟delay毫秒之后执行一次,实验结果如下:

Timer定时任务调度Api及优缺点_第2张图片

3.Timer.schedule(TimerTask task, Date firstTime, long period)

从fistTime开始,每隔period毫秒循环执行task任务

实验结果:

Timer定时任务调度Api及优缺点_第3张图片

4.Timer.schedule(TimerTask task, long delay, long period)

延迟delay毫秒第一次执行,然后间隔period毫秒循环执行task任务。

实验结果:

Timer定时任务调度Api及优缺点_第4张图片

5.Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

在firstTime第一次执行,间隔period毫秒循环执行,这个跟Timer.schedule(TimerTask task, Date firstTime, long period)是有区别的。主要是任务开始时间跟当前时间相比才体现出来,下面这种是看不出来的。

Timer定时任务调度Api及优缺点_第5张图片

实验区别的地方:

首次计划执行的时间早于当前时间

schedule的输出:

Timer定时任务调度Api及优缺点_第6张图片

scheduleAtFixedRate的输出:

Timer定时任务调度Api及优缺点_第7张图片

任务执行所需时间超出任务的执行周期间隔

改造下MyTimerTask,模拟任务执行需要3秒钟,而间隔时间为2秒,看实验结果的不同。

package com.hbk.test;

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask{

    @Override
    public void run() {
        // 模拟任务执行需要3秒钟
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(scheduledExecutionTime()));// 打印任务真正执行时间
    }
}

scheduleAtFixedRate的输出:

Timer定时任务调度Api及优缺点_第8张图片

schedule的输出:

Timer定时任务调度Api及优缺点_第9张图片

6.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

同样跟Timer.schedule(TimerTask task, long delay, long period)存在如上区别。

7.Timer.cancel()

任务取消执行
模拟场景:任务执行3次后停止任务执行。

public class MyTimerTask extends TimerTask{

    private int count = 0;
    private Timer myTimer;

    public MyTimerTask(Timer timer){
        myTimer = timer;
    }
    @Override
    public void run() {
        if(count<3){
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println(df.format(scheduledExecutionTime()));// 打印任务真正执行时间
            count++;
        }else{
            cancel();
            System.out.println("task canceled !");
        }

    }
}

Timer定时任务调度Api及优缺点_第10张图片

8.Timer.purge()

返回任务取消的个数

Timer定时任务调度Api及优缺点_第11张图片

JDK自带的定时任务调度只需要了解这么多即可,在平时的业务要求下,如果要支持并发性或者业务复杂的情况下,请使用Quartz框架,因为Timer满足不了你!

你可能感兴趣的:(jdk)