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() {

本文对比分析了Java和Android中两种常见的定时任务实现:Timer和ScheduledExecutorService。Timer虽然简单,但任务执行时间长或异常会影响其他任务。而ScheduledExecutorService基于线程池,能避免这些问题,适合生产环境使用。此外,还介绍了DelayQueue和Sleep休眠方法作为定时任务的补充方案。
最低0.47元/天 解锁文章
1016

被折叠的 条评论
为什么被折叠?



