1. Timer
Timer
是 JDK 自带的定时任务执行类,可以直接使用 Timer
来实现定时任务。这种实现方式比较简单,可以指定首次执行的延迟时间、首次执行的具体日期时间,以及执行频率,能满足日常需要。Timer
是线程安全的,因为背后是单线程在执行所有任务。Timer
是基于绝对时间调度的,而不是基于相对时间,所以它对系统时间的改变非常敏感。
1.1 使用:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 测试定时任务
*/
public class Test {
public static void main(String[] args) {
// 定义一个任务
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("Run timerTask:" + new Date());
}
};
// 计时器
Timer timer = new Timer();
// 添加执行任务(延迟 1s 执行,每 2s 执行一次)
timer.schedule(timerTask, 1000, 2000);
}
}
几个重要的方法:
schedule()
:开始调度任务,提供了几个包装方法;cancle()
:终止任务调度,取消当前调度的所有任务,正在运行的任务不受影响;purge()
:从任务队列中移除所有已取消的任务;
另外,java.util.TimerTask
就是实现了 Runnable
接口,具体任务逻辑则是在 run()
方法里去实现。
public abstract class TimerTask implements Runnable {
// ......
}
执行结果如下:
Run timerTask:Wed Mar 17 10:42:05 CST 2021
Run timerTask:Wed Mar 17 10:42:07 CST 2021
Run timerTask:Wed Mar 17 10:42:09 CST 2021
Run timerTask:Wed Mar 17 10:42:11 CST 2021
Run timerTask:Wed Mar 17 10:42:13 CST 2021
Run timerTask:Wed Mar 17 10:42:15 CST 2021
Run timerTask:Wed Mar 17 10:42:17 CST 2021
Run timerTask:Wed Mar 17 10:42:19 CST 2021
Run timerTask:Wed Mar 17 10:42:21 CST 2021
......
1.2 Timer 缺点分析:
问题 1:任务执行时间长影响其他任务。
开启两个线程,如下:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
* 测试定时任务
*/
public class Test {
public static void main(String[] args) {
// 定义任务 1
TimerTask timerTask1 = new TimerTask() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);// 休眠 3 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Run timerTask 1:" + new Date());
}
};
// 定义任务 2
TimerTask timerTask2 = new TimerTask() {