首先创建一个MyTimerTask类,让他继承TimerTask,实现run方法,run方法中写的就是这个所执行任务的业务逻辑。而这一整个类就是作为定时任务中的任务。
package com.csyd.timer;
import java.util.TimerTask;
/**
* Created by ChengShanyunduo
* 2018/3/1
*/
public class MyTimerTask extends TimerTask{
private String name;
public MyTimerTask(String inputName){
name = inputName;
}
@Override
public void run() {
//打印当前name的内容
System.out.println("我的Timer名字是:" + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后再main函数中实例化一个Timer,在创建一个task。 Timer中要传进去3个参数,第一个参数是task,就是刚刚创建的类, 也就是你想要执行的事情,第二个参数是long型, 秒数, 代表要多久之后开始执行, 第三个参数也是秒数, 代表每隔多久执行一次。
import com.csyd.timer.MyTimerTask;
import java.util.Timer;
public class Main {
public static void main(String[] args) {
//创建Timer实例
Timer timer = new Timer();
//创建TimerTask实例
MyTimerTask myTimerTask = new MyTimerTask("No.1");
//t通过timer定时定频率调用myTimerTask的业务逻辑
//当前时间的2秒钟之后每隔一秒钟执行一次
timer.schedule(myTimerTask, 2000L, 1000L);
}
}
这个定时任务执行出来就是,2秒之后, 每隔1秒打印一个task的名字No.1。
schedule的4种用法
1.schedule(task, time)
task(TimerTask):要执行的任务
time(Date):执行的时间(什么时候去执行),只执行一次,如果time早于现在的时间,就会立即执行。
2.schedule(task, delay)
task(TimerTask):要执行的任务
delay(Long):多久后去执行,只执行一次。比如如果delay的值为2000,task就会在距离当前时间2秒后去执行。
3.schedule(task, time, period)
task(TimerTask):要执行的任务
time(Date):第一次执行任务的时间
period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。
4.schedule(task, delay, period)
task(TimerTask):要执行的任务
delay(Long):多久后去执行
period(Long):每隔多久执行一次
scheduleAtFixedRate的2种用法
1.scheduleAtFixedRate(task, time, period)
task(TimerTask):要执行的任务
time(Date):第一次执行任务的时间
period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。
2.scheduleAtFixedRate(task, delay, period)
task(TimerTask):要执行的任务
delay(Long):多久后去执行
period(Long):每隔多久执行一次
1.如果第一次执行的时间被delay,比如设定的执行时间为12:00:00,但timer开始执行的时候是12:00:06,schedule会以此顺延时间,第一次执行时间就变为了12:00:06,而scheduleAtFixedRate会按照上一次开始的时间计算,为了赶上进度会多次执行任务,以此需要考虑同步。
2.任务执行需要的时间如果超出时间间隔,比如这个任务执行完需要3秒,而timer中定的周期为2秒,schedule会将执行的时间以此顺延,也就是完成了一个3秒的任务后,继续完成下一个任务,并且不会间断。而scheduleAtFixedRate时间不会顺延,会有并发性。
其他方法
1.TimerTask中
cancel() —— 取消当前TimerTask里的任务,在TimerTask的run方法中使用。
timerTask.scheduledExecutionTime() —— 返回此任务最近执行的已安排执行的时间(也就是下一次执行的时间),返回值为long。
2.Timer中
timer.cancle() —— 结束当前计时器,取消所有任务。
timer.purge() —— 从该计时器的任务队列中移除所有已取消的任务,返回值为移除的任务数。
Timer定时器的缺点
1.管理并发任务:Timer里有且只有一个线程去执行定时任务,如果存在多个任务且任务时间过长,会导致执行效果与预期不符,无法并发。
2.任务抛出异常:如果TimerTask抛出RuntimeException异常,Timer会停止所有的任务。
不建议使用Timer的情况
1.对时效性较高的多任务并发作业。
2.对复杂的任务的调度。
学习视频:https://www.imooc.com/learn/841