schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。
比如
SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = fTime.parse("2005/12/30 14:10:00");
t.scheduleAtFixedRate(new TimerTask(){
public void run()
{
System.out.println("this is task you do6");
}
},d1,3*60*1000);
间隔时间是3分钟,指定开始时间是2005/12/30 14:10:00,如果我在14:17:00分执行这个程序,那么会立刻打印3次
this is task you do6 //14:10
this is task you do6 //14:13
this is task you do6 //14:16
并且注意,下一次执行是在14:19 而不是 14:20。就是说是从指定的开始时间开始计时,而不是从执行时间开始计时。
但是上面如果用schedule方法,间隔时间是3分钟,指定开始时间是2005/12/30 14:10:00,那么在14:17:00分执行这个程序,则立即执行程序一次。并且下一次的执行时间是 14:20,而不是从14:10开始算的周期(14:19)。
需要注意的是scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果是不同的。上面例子中任务只是打印一个字符串,比较简单。但如果任务比较复杂,或者由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则scheduleAtFixedRate方法将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”;而schedule方法的后续执行也将被延迟。所以,在长期运行中,scheduleAtFixedRate执行的频率将正好是指定周期的倒数,schedule 执行的频率一般要稍慢于指定周期的倒数。
scheduleAtFixedRate 效率总体上高于schedule
分享到:
相关推荐
Java 中 Timer 的 schedule 和 scheduleAtFixedRate 方法区别详解 Java 中的 Timer 类提供了两个常用的方法:schedule 和 scheduleAtFixedRate,用于安排和执行定时任务。虽然这两个方法看起来很相似,但是它们之间...
本篇文章将深入探讨 `Timer` 类的两个核心方法:`schedule` 和 `scheduleAtFixedRate`,以及它们在实际开发中的应用。 首先,`schedule` 方法有两种重载形式,一种是安排一个 `TimerTask` 在特定的延迟后执行,另一...
Timer类有两种执行任务的模式:schedule和scheduleAtFixedRate。schedule模式可以在某个时间或固定的时间延迟后执行任务,而scheduleAtFixedRate模式可以让任务在固定的频率下运行。 schedule模式的使用方法如下所...
接下来,我们可以使用`Timer`的`schedule()`方法来安排任务的执行。例如,如果你想在特定延迟后执行一次任务,可以这样操作: ```java Timer timer = new Timer(); timer.schedule(new MyTask(), 5000); // 延迟5秒...
timer.scheduleAtFixedRate(task, 0, 5000); // 零延迟开始,每5秒执行一次 ``` 需要注意的是,`TimerTask`中的`run()`方法会在后台线程执行,因此不能直接更新UI。如果需要更新UI,需要借助`Handler`或`...
要将`TimerTask`添加到任务池并设定执行时间,可以使用`Timer`的`schedule()`或`scheduleAtFixedRate()`方法。前者用于一次性或间隔性的任务,而后者则用于定期执行任务,即使前一次执行超时也会继续执行下一次。 ...
在使用Timer来执行周期性任务时,需要在TimerTask中实现run()方法,并且可以使用Timer的scheduleAtFixedRate()方法来安排任务的执行时间。 Timer的缺陷主要体现在两个方面:一是Timer只创建唯一的线程来执行所有...
创建一个`Timer`对象后,你可以使用`schedule()`或`scheduleAtFixedRate()`方法来安排任务。`schedule()`方法用于单次延迟执行,而`scheduleAtFixedRate()`方法则用于周期性地执行任务。 下面是一个使用`Timer`类...
接下来,我们可以通过`Timer`类的`schedule`方法来安排任务的执行。例如,如果你想在5秒后执行一次任务,可以这样做: ```java Timer timer = new Timer(); SimpleTask task = new SimpleTask(); timer.schedule...
然后,我们可以使用`schedule`或`scheduleAtFixedRate`方法来安排任务。`schedule`方法用于一次性执行任务,而`scheduleAtFixedRate`则用于按固定速率周期性执行任务。 `TimerTask`是`Timer`类的辅助类,它代表一个...
当你调用`Timer`的`schedule`或`scheduleAtFixedRate`方法时,任务会被添加到内部的任务队列中,并在指定的时间由`Timer`的后台线程执行。`Timer`实例一旦创建,就会持续运行,直到所有的任务都执行完毕,或者通过...
`Timer`提供了几种方法来安排任务,如`schedule(TimerTask task, long delay)`和`schedule(TimerTask task, Date firstTime, long period)`,分别用于延迟执行和周期性执行。 2. **TimerTask类**: `java.util....
使用Timer对象的schedule()或scheduleAtFixedRate()方法安排任务执行。schedule()方法用于单次执行,scheduleAtFixedRate()方法用于周期性执行。例如: - 单次执行: ```java TimerTask myTask = new MyTask(); ...
使用`Timer`对象的`schedule()`方法可以安排任务的执行。如果你想要在特定延迟后执行一次任务,可以使用如下代码: ```java TimerTask task = new ProgressUpdateTask(); timer.schedule(task, delay); ``` ...
- 调用了`timer.schedule(new MyTask(), 1000, 2000)`来安排任务,在1秒后首次执行,并且每2秒重复执行一次。 - 使用了一个无限循环来等待用户的输入,如果用户输入字符`c`,则调用`timer.cancel()`来取消所有的定时...
它包含两个核心方法:schedule(TimerTask task, long delay)和scheduleAtFixedRate(TimerTask task, long initialDelay, long period)。前者在指定延迟后首次执行任务,而后者则会按固定的间隔重复执行任务。 ...
`Timer`类主要通过`schedule`系列方法来安排任务的执行。例如,我们可以使用`schedule(TimerTask task, long delay)`方法来在指定延迟后执行一次性任务: ```java TimerTask task = new TimerTask() { @Override ...
3. 计划任务:使用 `schedule()` 或 `scheduleAtFixedRate()` 方法来安排 `TimerTask` 的执行。前者按指定延迟后首次执行,然后每次间隔指定的时间执行;后者则保证两次执行之间的间隔固定,即使上一次执行超时也...
在上述代码中,`timer.schedule()` 方法会在延迟5秒后执行任务一次,而`timer.scheduleAtFixedRate()` 会每隔5秒执行一次任务。 ### 2. Quartz Quartz 是一个开源的作业调度框架,它提供了更强大和灵活的定时任务...
使用`Timer`类,你可以创建一个`TimerTask`实例,然后通过`Timer`的`schedule()`或`scheduleAtFixedRate()`方法来设定任务的执行时间。 1. **创建定时任务**:创建一个`TimerTask`子类,重写`run()`方法,这将是你...