java的定时任务调度:
1、timer —-jdk自带的。
2、quartz—-第三方jar包

这里分享一下第一种Timer的使用,具体实际中,能用Timer的就别用quartz。

Timer:java.util.Timer
有且仅有一个后台线程对多个业务流程进行定时定频率的调度。

原理:Timer 定时调用 TimerTask

一、Timer的调度器

Timer的两个调度器—-schedule和scheduleAtFixedRate

schedule()

  1. schedule(task,time)
    在时间等于或超过time的时候执行,且只执行一次。
  2. schedule(task,time,period)
    时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。
  3. schedule(task,delay)
    等待delay毫秒后执行一次task
  4. schedule(task,delay,period)
    等待delay毫秒后执行task,以后每隔period毫秒重复执行一次task

scheduleAtFixedRate()

  1. scheduleAtFixedRate(task,time,period)
    时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。
  2. scheduleAtFixedRate(task,delay,period)
    等待delay毫秒后执行task,以后每隔period毫秒重复执行一次task

二、Timer和TimerTask的其它函数

TimerTask的其它函数

  1. cancel()
    取消TimerTask的执行
  2. scheduledExecutionTime()
    返回此任务最近实际执行的已安排执行的时间,为long型

Timer的其它函数

  1. cancel()
    终止此计时器,丢弃所有当前已安排的任务
  2. purge()
    从此计时器的任务队列中移除所有已取消的任务。返回值:从队列中移除的任务数。

三、Timer两个调度器之间的区别

schedule() scheduleAtFixedRate()区别
1、首次计划执行时间早于当前时间
前者:如果第一次执行时间在计划时间之前,随后的执行时间按照上一次实际执行完成的时间点进行计算。
后者:如果第一次执行时间在计划时间之前,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步。

2、任务执行时间超出执行周期间隔
前者:下次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后。
后者:下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性。

四、Timer的使用限制

Timer的两种缺陷:

  1. 并发任务的缺陷:
    Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符。
  2. 当任务抛出异常时的缺陷:
    如果TimerTask抛出RunTimeException,Timer会停止所有任务的执行。

使用禁区:
* 对时效性要求较高的多任务并发作业
* 对复杂的任务的调度

五、简单的实例

1、MyTimerTask 类

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


public class MyTimerTask extends TimerTask{

    private String taskName;
    public MyTimerTask(String name){
        taskName = name;
    }


    public void run(){
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        System.out.println("current exec time :"+sf.format(calendar.getTime()));
        System.out.println("current exec name :"+taskName);
    }

    public void SetName(String name){
        taskName = name;
    }

    public String GetName(){
        return taskName;
    }
}

2、MyTimer类

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


public class MyTimer{

    public static void main(String[] args) {
        Timer myTimer = new Timer();
        MyTimerTask myTimeTask = new MyTimerTask("task1");

        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        System.out.println("current time :"+sf.format(calendar.getTime()));
        calendar.add(Calendar.SECOND,3);

        myTimeTask.SetName("schedule1");
        myTimer.schedule(myTimeTask,calendar.getTime(),2000L);

        // myTimeTask.SetName("schedule2");
        // myTimer.schedule(myTimeTask,2000L,1000L);
    }
}