import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;
/**
* 定时任务
*/
public class MyTimerTask extends TimerTask{
/**
* 通过构造器注入 Timer对象,任务执行后调用Timer的cancel方法终止计时器
*/
public MyTimerTask(Timer timer) {
this.timer = timer;
}
Timer timer;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void run() {
// scheduledExecutionTime() : 返回此任务最近实际 执行的安排 执行时间
System.out.println("执行时间 "+format.format(scheduledExecutionTime()));
/// 测试 任务执行时间超过任务循环周期时使用下面代码
/*
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}*/
//如果只执行一次,在这里调用Timer的cancel方法结束任务(调用TimerTask的cancel不管用)
timer.cancel(); // Timer 终止此计时器
// this.cancel(); // TimerTask 终止此计时器 (不管用)
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Timer;
/**
* 定时任务 测试
*/
public class MyTimerTest {
public static void main(String[] args) throws ParseException {
//创建计时器
Timer timer = new Timer();
//创建任务
MyTimerTask task = new MyTimerTask(timer);
System.out.println(LocalDateTime.now());
//执行任务
// 延迟3000毫秒后执行,且只执行一次(执行后不会自动关闭)
timer.schedule(task, 3000);
//其他方法
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2. 在指定时间执行 ,只执行一次
// timer.schedule(task,format.parse("2018-07-12 14:21:00"));
//3. 延迟3000毫秒后,每隔2000毫秒执行一次
// timer.schedule(task, 3000, 2000);
//4. 在指定开始执行,之后每隔2000毫秒执行一次
/* schedule方法与scheduleAtFixedRate方法 区别
* 1.如果当前时间晚于指定时间,以当前时间为开始时间
* 2.如果任务执行时间超过重复间隔时间,则按照实际时间往后顺延(同步执行)
*/
// timer.schedule(task, format.parse("2018-07-12 14:25:00"), 2000);
//5. 延迟3000毫秒后,每隔2000毫秒执行一次
// timer.scheduleAtFixedRate(task, 3000, 2000);
//6. 在指定开始执行,之后每隔2000毫秒执行一次
/*schedule方法与scheduleAtFixedRate方法 区别
* 1.如果当前时间晚于指定时间,则以指定时间开始,并把从指定时间到
* 当期时间之间该执行的全部补回来
* 2.如果任务执行时间超过间隔时间,则按照设定间隔时间执行 (异步执行)
*/
// timer.scheduleAtFixedRate(task, format.parse("2018-07-12 14:57:00"), 2000);
}
}