定时线程的任务调度
Timer类
线程调度任务以供将来在后台线程中执行的功能。任务可以安排一次执行,或定期重复执行。
对应于每个Timer对象是单个后台线程,用于依次执行所有定时器的所有任务。
定时线程schedule(),延时不追加执行任务。
定时线程scheduleAtFixedRate(),延时追加执行任务。
不追加执行任务的意思是,如果我们定时线程的首次调度时间已经过去了,那么就立即从当前时刻算起,每隔一段时间调度一次任务,之前没执行的就忽略了;而追加执行任务就是之前没执行的要补充回来。
| 方法 | 说明 |
|---|---|
| void schedule(TimerTask task, Date firstTime, long period) | 从指定的时间开始 ,对指定的任务执行重复的固定延迟执行 。 |
演示:
创建一个TimerTask实现类
/*
* TimerTask也实现了Runnable接口
* Timer的对象实现定时调度的方式有两种:
* schedule():延时不追加执行任务
* scheduleAtFixedRate():延时追加执行任务
*/
public class UserTask extends TimerTask {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + new Date());
}
}
/**
* @Author: Forward Seen
* @CreateTime: 2022/03/26 18:17
* @Description:
* 延时不追加任务意思是
* 当我们设置定时创建线程时,如果我们设置的这个时间已经过时了,我们start时就从当前时间开始计时
* 比如,我设置的时间是一个小时前,那么如果我现在启动start方法,那就相当于定时的时间是当前
*/
public class Test {
/**
* 这里的schedule方法有3个参数
* 第一个是TimerTask对象,run方法就在这个对象里,即执行任务的线程对象;
* 第二个是时间的参数,就是定时执行任务的时间
* 第三个是执行任务的间隔,单位是毫秒 比如,3000就是每隔3秒执行一次任务
*/
public static void main(String[] args) throws ParseException {
Timer t = new Timer();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = sdf.parse("2022-3-26 18:24:59");
t.schedule(new UserTask(),date,5000);
}
}
如果当前时间没到18:24:59,那么它会等到该时间首次调度任务,然后每隔5000毫秒调度一次;

如果当前时间已经过了18:24:59,那么它会立即调度任务,但是不会补充期间本应该调度的任务,然后每隔5000毫秒调度一次。

将schedule()换成scheduleAtFixedRate()
t.scheduleAtFixedRate(new UserTask(),date,5000);
对于scheduleAtFixedRate(),如果当前时间已经过了18:24:59,那么它会立即调度任务,同时它会追加期间本应该调度的任务,然后每隔5000毫秒调度一次。

本文详细介绍了Java中的Timer类用于定时任务调度的功能,包括schedule()方法和scheduleAtFixedRate()方法的使用。区别在于schedule()在任务延迟时间已过时从当前时间开始执行,不补充未执行的任务,而scheduleAtFixedRate()则会追加并立即执行错过的任务。通过示例代码展示了两种方法的不同行为,并解释了它们在实际应用中的应用场景。
2856

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



