scheduleAtFixedRate与schedule的区别主要是基准时间点以及第一次执行时执行的次数
timer.scheduleAtFixedRate(TimerTask, startTime, period): 如果执行时间executeTime>startTime,则一执行就会从startTime开始(startTime时就会跑一次),每隔peroid跑TimerTask。以startTime为起点。
public class TimerTest { public static void main(String args[]) throws ParseException { SimpleDateFormat f = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println("do task at "+new Date()); } }, f.parse("2014-04-15 17:20:00"), 10 * 1000); } }
执行时间是17:28:01,执行结果是
do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:01 CST 2014 //以上是开始执行时立刻执行了X次,X是从startTime开始每隔peroid时间执行一次直到executeTime. //以下是以startTime开始每隔peroid执行一次 do task at Tue Apr 15 17:28:10 CST 2014 do task at Tue Apr 15 17:28:20 CST 2014
timer.schedule(TimerTask, startTime, period): 如果执行时间executeTime>startTime,其实基准时间已经变成executeTime,每隔peroid跑TimerTask。以executeTime为起点。(如果executeTime<startTime,则基准时间还是startTime)
同样的例子,结果是
do task at Tue Apr 15 17:28:01 CST 2014 do task at Tue Apr 15 17:28:11 CST 2014 do task at Tue Apr 15 17:28:21 CST 2014
就在executeTime执行一次,然后以executeTime为基准点每隔peroid执行一次
scheduleAtFixedRate与schedule的下一次执行时间都是上一次执行完成时间+间隔时间,只是由于第一次执行时executeTime>startTime时造成的基准时间不一致而造成的的。
另外,如果task的执行时长>间隔时长peroid, 则下一次执行时间是上一次完成时间, scheduleAtFixedRate与schedule和都是一样的。
public class TimerTest { public static void main(String args[]) throws ParseException { SimpleDateFormat f = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("start do task at "+new Date()); try{ Thread.sleep(11000); }catch(Exception e){ e.printStackTrace(); } System.out.println("end do task at "+new Date()); } }, f.parse("2014-04-15 18:01:00"), 10 * 1000); } }
执行时间是18:01:25, 执行结果
start do task at Tue Apr 15 18:01:25 CST 2014 end do task at Tue Apr 15 18:01:36 CST 2014 //这里可以看出下次执行时间就是上次完成时间 start do task at Tue Apr 15 18:01:36 CST 2014 end do task at Tue Apr 15 18:01:47 CST 2014 start do task at Tue Apr 15 18:01:47 CST 2014 end do task at Tue Apr 15 18:01:58 CST 2014
scheduleAtFixedRate结果也是一样的
相关推荐
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秒...
要将`TimerTask`添加到任务池并设定执行时间,可以使用`Timer`的`schedule()`或`scheduleAtFixedRate()`方法。前者用于一次性或间隔性的任务,而后者则用于定期执行任务,即使前一次执行超时也会继续执行下一次。 ...
timer.scheduleAtFixedRate(task, 0, 5000); // 零延迟开始,每5秒执行一次 ``` 需要注意的是,`TimerTask`中的`run()`方法会在后台线程执行,因此不能直接更新UI。如果需要更新UI,需要借助`Handler`或`...
创建一个`Timer`对象后,你可以使用`schedule()`或`scheduleAtFixedRate()`方法来安排任务。`schedule()`方法用于单次延迟执行,而`scheduleAtFixedRate()`方法则用于周期性地执行任务。 下面是一个使用`Timer`类...
### Timer与TimerTask详解 在Java编程语言中,`Timer`和`TimerTask`是用于执行定时任务的重要类。这两个类通常被用来处理那些需要在指定时间或周期性执行的任务,比如定时清理缓存、定时更新数据库等场景。 #### ...
3. 计划任务:使用 `schedule()` 或 `scheduleAtFixedRate()` 方法来安排 `TimerTask` 的执行。前者按指定延迟后首次执行,然后每次间隔指定的时间执行;后者则保证两次执行之间的间隔固定,即使上一次执行超时也...
它包含两个核心方法:schedule(TimerTask task, long delay)和scheduleAtFixedRate(TimerTask task, long initialDelay, long period)。前者在指定延迟后首次执行任务,而后者则会按固定的间隔重复执行任务。 ...
- 调用了`timer.schedule(new MyTask(), 1000, 2000)`来安排任务,在1秒后首次执行,并且每2秒重复执行一次。 - 使用了一个无限循环来等待用户的输入,如果用户输入字符`c`,则调用`timer.cancel()`来取消所有的定时...
接下来,我们可以通过`Timer`类的`schedule`方法来安排任务的执行。例如,如果你想在5秒后执行一次任务,可以这样做: ```java Timer timer = new Timer(); SimpleTask task = new SimpleTask(); timer.schedule...
在使用Timer来执行周期性任务时,需要在TimerTask中实现run()方法,并且可以使用Timer的scheduleAtFixedRate()方法来安排任务的执行时间。 Timer的缺陷主要体现在两个方面:一是Timer只创建唯一的线程来执行所有...
使用`Timer`类,你可以创建一个`TimerTask`实例,然后通过`Timer`的`schedule()`或`scheduleAtFixedRate()`方法来设定任务的执行时间。 1. **创建定时任务**:创建一个`TimerTask`子类,重写`run()`方法,这将是你...
然后,我们可以使用`schedule`或`scheduleAtFixedRate`方法来安排任务。`schedule`方法用于一次性执行任务,而`scheduleAtFixedRate`则用于按固定速率周期性执行任务。 `TimerTask`是`Timer`类的辅助类,它代表一个...
7. **注意与线程池的区别**: 虽然Java定时器可以用来调度任务,但它不同于Java的ExecutorService或ScheduledExecutorService。后者是Java并发API的一部分,提供了更高级的线程管理和任务调度功能,如更灵活的定时...
当你调用`Timer`的`schedule`或`scheduleAtFixedRate`方法时,任务会被添加到内部的任务队列中,并在指定的时间由`Timer`的后台线程执行。`Timer`实例一旦创建,就会持续运行,直到所有的任务都执行完毕,或者通过...
`Timer`提供了几种方法来安排任务,如`schedule(TimerTask task, long delay)`和`schedule(TimerTask task, Date firstTime, long period)`,分别用于延迟执行和周期性执行。 2. **TimerTask类**: `java.util....
使用`Timer`对象的`schedule()`方法可以安排任务的执行。如果你想要在特定延迟后执行一次任务,可以使用如下代码: ```java TimerTask task = new ProgressUpdateTask(); timer.schedule(task, delay); ``` ...
在主程序中,我们可以通过Timer的schedule()或scheduleAtFixedRate()方法来安排任务执行: ```java Timer timer = new Timer(); timer.schedule(new FileStatusChecker(fileName), initialDelay, period); ``` ...