前言,本文主要对Timer类的介绍以及API的使用详情
是什么是定时任务调度?
基于给定的时间点、给定的时间间隔或者给定的执行次数自动执行任务。
Timer 由JDK自带提供!
Timer的定义
有且仅有一个后台线程对多个业务线程进行定时定频率的调度
Timer定时调度任务的四种用法
首先,创建一个MyTimerTask类,继承TimerTask
1 | public class MyTimerTask extends TimerTask { |
1.schedule(task, time) : 在时间等于或者超过time的时候执行,且执行一次task。1
2
3
4
5
6
7
8
9
10
11// 创建一个Timer实例
Timer timer = new Timer();
// 创建一个TimerTask实例
MyTimerTask task = new MyTimerTask("s1");
/**
* 在时间等于或者超过time的时候执行,且执行一次task
*/
Calendar calendar = Calendar.getInstance();
// 在当前时间的5秒后执行该任务
calendar.add(Calendar.SECOND, 5);
timer.schedule(task, calendar.getTime());
2.schedule(task, time, period) : 在时间等于或者超过time的时候首次执行task,之后每隔period毫秒重复执行task1
2
3
4
5
6
7
8
9// 创建一个Timer实例
Timer timer = new Timer();
// 创建一个TimerTask实例
MyTimerTask task = new MyTimerTask("s2");
Calendar calendar = Calendar.getInstance();
/**
* 在时间等于或者超过time的时候首次执行task,之后每隔period毫秒重复执行task
*/
timer.schedule(task, calendar.getTime(), 3000);
3.schedule(task, delay) : 等待delay毫秒后执行且执行一次task1
2
3
4
5
6
7
8// 创建一个Timer实例
Timer timer = new Timer();
// 创建一个TimerTask实例
MyTimerTask task = new MyTimerTask("s3");
/**
* 等待delay毫秒后执行且执行一次task
*/
timer.schedule(task, 3000);
4.schedule(task, delay, period) : 等待等于或者超过delay毫秒后首次执行task 之后每隔period毫秒重复执行task1
2
3
4
5
6
7
8// 创建一个Timer实例
Timer timer = new Timer();
// 创建一个TimerTask实例
MyTimerTask task = new MyTimerTask("小米");
/**
* 等待delay毫秒后首次执行task 之后每隔period毫秒重复执行task
*/
timer.schedule(task, 3000, 2000);
scheduleAtFixedRate的两种用法
1.scheduleAtFixedRate(TimerTask task, Date firstTime, long period) : 时间等于或者超过time的时候首次执行task,之后每隔period毫秒重复执行task1
2
3
4
5
6
7
8
9// 创建一个Timer实例
Timer timer = new Timer();
// 创建一个TimerTask实例
MyTimerTask task = new MyTimerTask("scheduleAtFixedRate1");
Calendar calendar = Calendar.getInstance();
/**
* 时间等于或者超过time的时候首次执行task,之后每隔period毫秒重复执行task
*/
timer.scheduleAtFixedRate(task, calendar.getTime(), 2000);
2.scheduleAtFixedRate(TimerTask task, long delay, long period):等待等于或者超过delay毫秒后首次执行task 之后每隔period毫秒重复执行task1
2
3
4
5
6
7
8// 创建一个Timer实例
Timer timer = new Timer();
// 创建一个TimerTask实例
MyTimerTask task = new MyTimerTask("scheduleAtFixedRate2");
/**
* 等待等于或者超过delay毫秒后首次执行task 之后每隔period毫秒重复执行task
*/
timer.scheduleAtFixedRate(task, 3000, 2000);
TimerTask其他函数介绍
cancel() 取消当前TimerTask中的任务
scheduleExecutionTime() 返回此任务实际执行的已安排的执行时间
Timer其他函数介绍
- cancel() 终止此定时器,丢弃所有当前已安排的任务
- int purge() 从此计时器的任务队列中移除所有==已取消==的任务,返回值是从队列中移除的任务数
Timer的缺陷
- 管理并发任务的缺陷
- Timer有且只有一个线程去执行定时任务,如果存在多个任务且任务时间过长,会导致预期效果与实际效果不符
- 当任务抛出异常时的缺陷
- 如果TimerTask在执行时,抛出RuntimeException异常,Timer会停止所有任务的执行
- 不推荐使用的场景
- 对时效性要求较高的多任务并发
- 对复杂任务的调度