通俗一点讲,想要做一个定时任务,要具备两个东西——定时器(Timer)和任务(TimerTask)。
Timer
一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
注意:与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。
TimerTask
表示一个定时任务,它是一个抽象类,实现了Runnable,具体的定时任务需要继承该类,实现run方法(每次执行的代码放到这里面)。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
public class TimerTaskTest extends TimerTask {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void run() {
System.out.println("现在上海时间:"+df.format(new Date()));
}
}
import java.util.Timer;
public class Test {
public static void main(String[] args) {
Timer timer = new Timer();
//timer.schedule(task, delay, period)
//delay为long,period为long:从现在起过delay毫秒以后,每隔period 毫秒执行一次。
timer.schedule(new TimerTaskTest(), 1000, 1000);
}
}
现在上海时间:2018-07-02 17:35:27
现在上海时间:2018-07-02 17:35:28
现在上海时间:2018-07-02 17:35:29
现在上海时间:2018-07-02 17:35:30
现在上海时间:2018-07-02 17:35:31
现在上海时间:2018-07-02 17:35:32
//以下是几种调度task的方法:
timer.schedule(task, time);
// time为Date类型:在指定时间执行一次。
timer.schedule(task, firstTime, period);
// firstTime为Date类型,period为long 从firstTime时刻开始,每隔period毫秒执行一次。
timer.schedule(task, delay)
// delay 为long类型:从现在起过delay毫秒执行一次
timer.schedule(task, delay, period)
// delay为long,period为long:从现在起过delay毫秒以后,每隔period 毫秒执行一次。