什么是定时任务调度:
基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务。
Timer:
线程调度任务以供将来在后台线程中执行的功能。 任务可以安排一次执行,或定期重复执行。
一:一个简单的例子
需要执行的任务类:MyTimerTask

package com.schedule;

import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    private String name;

    public MyTimerTask(String inputName){
        name = inputName;
    }
    @Override
    public void run() {
       System.out.println("Current exec name is:"+ name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

定时任务调度:MyTimer

package com.schedule;

import java.util.Timer;

public class MyTimer {
    public static void main(String[] args) {
        //1.创建一个timer实例
        Timer myTimer = new Timer();
        //2.创建一个MyTimerTask实例
        MyTimerTask myTimerTask = new MyTimerTask("NO.1");
        //3.通过timer定时定频率调用myTimerTask的业务逻辑
        //第一次执行是在当前时间的两秒钟之后,之后每隔一秒执行一次
        myTimer.schedule(myTimerTask,2000L,1000L);
    }
}

二、timer一些函数的用法:
timer.schedule(task,time)
task:-需要执行的任务
time:-执行任务的具体时间
作用:task会在时间等于或大于time的时间点执行,任务只会被执行一次。
time.schedule(task,time,period)
task:-所要安排的任务
time:-首次执行任务的时间
period:-执行一次task的时间间隔,单位是毫秒。
作用:task会在time时间点首次执行,并每间隔period执行一次。
timer.schedule(task,delay)
task:-所要安排的任务
delay:-执行任务前的延迟时间,单位是毫秒
作用:等待delay毫秒后执行且仅执行一次task
timer.schedule(task,delay,period)
task:-所要安排的任务
delay:-执行任务前的延迟时间,单位是毫秒
period:-执行一次task的时间间隔,单位是毫秒
作用:等待delay毫秒后执行一次task,并每间隔period执行一次。
三、TimerTask和Timer里的函数的一些用法:
TimerTask:
timerTask.cancel( )
作用:取消当前TimerTask里的任务。
例:在当前run方法执行三次后取消当前任务
Timer:
timer.cancel()
作用:终止此计时器,丢弃所有当前已安排的任务
timer.purge()
作用:从此计时器的任务队列中移除所有已取消的任务。
返回值:从队列中移除的任务数。

import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    private String name;
    private Integer count = 0;

    public MyTimerTask(String inputName){
        name = inputName;
    }
    @Override
    public void run() {
        if (count < 3){
            System.out.println("Current exec name is:"+ name);
            count ++;
        }else {
            cancel();
            System.out.println("Task cancel");
        }

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

timer.scheduledExecutionTime()
作用:返回此任务最近实际执行的已安排执行的时间。
四:Timer的缺陷
1、管理并发任务的缺陷
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行结果与预期不符。
单个timer只有一个后台线程去执行任务,是可以new两个timer去分别调用任务实现并发的,但是不建议这么做,因为线程之间需要交互的话,多个timer之间的线程不好协调
2、当任务抛出异常时的缺陷
如果TimerTask抛出RuntimeException,Timer会终止所有任务的运行。
所以Timer的使用禁区为
1、对时效性较高的多任务并发作业,Timer的多任务如果任务执行时间很短的话看似是并行,实际上是串行。
2、对复杂的任务的调度。