系统定时任务
- Linux 的
crontab
命令 - windows 下面的
计划任务
JDK 定时任务
JDK Timer
- 特点
- 单线程执行,一个任务等待,全部等待
- 一个任务异常,全部挂掉
- 依赖系统时间
- 例子
public static void main(String[] args) {
Timer timer = new Timer();
// 延迟 1s 执行,按照时间间隔 2s 重复执行
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("~~~ JdkTimer ~~~");
}
}, 1000L, 2000L);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("~~~ JdkTimer2 ~~~");
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 一个任务异常,全部异常
int i = 1 / 0;
}
}, 2000L, 5000L);
}
ScheduledExecutor 定时线程池
- 类关系如下
- 调度方式
- schedule():指定的延迟时间后执行任务
- scheduleAtFixedRate():在
initialDelay
后开始执行,然后在initialDelay + period
后执行,接着在 initialDelay + 2 * period
后执行,依此类推。与任务内部消耗的时间无关 - scheduleWithFixedDelay():在
initialDelay
后开始执行,在每一次任务执行终止(任务内部消耗的时间计算在内)和下一次执行开始之间都存在给定的延迟(period)
- 例子
public static void test2() {
// 启动三个线程
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
executor.schedule(new Thread(new ScheduledTaskThread()), 1, TimeUnit.SECONDS);
executor.schedule(new Thread(new ScheduledTaskThread()), 1, TimeUnit.SECONDS);
executor.schedule(new Thread(new ScheduledTaskThread()), 1, TimeUnit.SECONDS);
}
public static void test3() {
// 启动三个线程
ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
// 有频率的定时器, 如 1 秒后输出,每隔 2秒再次输出。
// 也就是将在 initialDelay(1) 后开始执行,然后在initialDelay + period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。(任务内部消耗的时间无关)
executor.scheduleAtFixedRate(new Thread(new ScheduledTaskThread()), 1, 2, TimeUnit.SECONDS);
// 推迟的定时器,如 1 秒后输出,3秒后再次输出。
// 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。(任务内部消耗的时间计算在内)
executor.scheduleWithFixedDelay(new Thread(new ScheduledTaskThread()), 1, 2, TimeUnit.SECONDS);
}
Timer 与 ScheduledExecutor 比较
- ScheduledExecutor 内不是多线程执行,解决 Timer 不准确延迟的问题
- ScheduledExecutor 内不是多线程执行,所以一个任务异常不会影响其他任务执行
- ScheduledExecutor 是基于时间的延迟(没有Date系统时间的依赖),不会因为系统时间改变而发生执行上的变化
- 注意:ScheduledExecutor 执行的周期任务,如果执行过程中跑出异常,该任务会被终止,不会周期性的执行
参考
- 源码地址 Learning_Job_Schedule