Timer是java.util自带的类,该类可以完成定时任务调度功能,但是只有一个后台线程,所以不支持并发,而且当遇到运行时错误的时候会停止所有正在执行的任务。Quartz可以说是大哥,改善了这两大缺陷。
Timer Api接口介绍:
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毫秒之后执行一次,实验结果如下:
3.Timer.schedule(TimerTask task, Date firstTime, long period)
从fistTime开始,每隔period毫秒循环执行task任务
实验结果:
4.Timer.schedule(TimerTask task, long delay, long period)
延迟delay毫秒第一次执行,然后间隔period毫秒循环执行task任务。
实验结果:
5.Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
在firstTime第一次执行,间隔period毫秒循环执行,这个跟Timer.schedule(TimerTask task, Date firstTime, long period)是有区别的。主要是任务开始时间跟当前时间相比才体现出来,下面这种是看不出来的。
实验区别的地方:
首次计划执行的时间早于当前时间
schedule的输出:
scheduleAtFixedRate的输出:
任务执行所需时间超出任务的执行周期间隔
改造下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的输出:
schedule的输出:
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 !");
}
}
}
8.Timer.purge()
返回任务取消的个数
JDK自带的定时任务调度只需要了解这么多即可,在平时的业务要求下,如果要支持并发性或者业务复杂的情况下,请使用Quartz框架,因为Timer满足不了你!