`
javaEEdevelop
  • 浏览: 876474 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Timer的schedule和scheduleAtFixedRate方法的区别解析(转载)

 
阅读更多
在java中,Timer类主要用于定时性、周期性任务 的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下

(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间按 照 上一次 实际执行完成的时间点 进行计算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步 
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
Date startDate = dateFormatter.parse("2010/11/26 00:20:00");  
Timer timer = new Timer();  
timer.scheduleAtFixedRate(new TimerTask(){  
   public void run()  
   {  
       System.out.println("execute task!" + this.scheduledExecutionTime());  
   }  
},startDate,3*60*1000);  
 以上的代码,表示在2010-11-26 00:20:00秒开始执行,每3分钟执行一次
假设在2010/11/26 00:27:00执行
以上会打印出3次
execute task!   00:20
execute task!   00:23    catch up
execute task!   00:26    catch up
下一次执行时间是00:29,相对于00:26
当换成schedule方法时,在2010/11/26 00:27:00执行
会打印出1次
execute task!   00:20   无catch up
下一次执行时间为00:30,相对于00:27

以上考虑的都是在你设定的timer开始时间后,程序才被执行

当执行任务的时间大于周期间隔时,会发生什么呢?
(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
(2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性 
以下例程序来测试上述结论,TimerTask需要执行6秒钟,但是间隔周期为5秒钟
package test;  
import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.Date;  
import java.util.Timer;  
import java.util.TimerTask;  
public class Test {  
      
    public static void main(String[] args) throws ParseException {  
        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
        Date startDate = dateFormatter.parse("2010/11/28 01:06:00");  
        Timer timer = new Timer();  
        timer.schedule(new TimerTask(){  
           public void run() {  
               try {  
                   Thread.sleep(6000);  
               } catch (InterruptedException e) {  
                   e.printStackTrace();  
               }  
               System.out.println("execute task!"+ this.scheduledExecutionTime());  
           }  
        },startDate, 5 * 1000);  
    }  
      
}  
 schedule方法的执行结果如下:
execute task!1290877560001
execute task!1290877566001
execute task!1290877572001
execute task!1290877578001
execute task!1290877584001
execute task!1290877590001
execute task!1290877596001
execute task!1290877602001
execute task!1290877608001
execute task!1290877614001
execute task!1290877620001
execute task!1290877626001
execute task!1290877632001
execute task!1290877638001
可以看出,间隔时间都为6秒,因此,下一次的执行时间点=上一次程序执行完成的时间点+间隔时间 
当换成scheduleAtFixedRate方法的执行结果如下:
execute task!1290877860000
execute task!1290877865000
execute task!1290877870000
execute task!1290877875000
execute task!1290877880000
execute task!1290877885000
execute task!1290877890000
execute task!1290877895000
execute task!1290877900000
execute task!1290877905000
execute task!1290877910000
execute task!1290877915000
execute task!1290877920000
execute task!1290877925000
execute task!1290877930000
可以看出,间隔时间都为5秒,因此,下一次的执行时间点=上一次程序开始执行的时间点+间隔时间 ;并且因为前一个任务要执行6秒,而当前任务已经开始执行了,因此两个任务间存在重叠,需要考虑线程同步

http://blog.csdn.net/gtuu0123/article/details/6040159 原址
分享到:
评论

相关推荐

    定时器Timer用法及其源码

    本篇文章将深入探讨`Timer`类的使用方法以及其源码解析。 ### 1. `Timer`类的创建与使用 创建一个`Timer`对象非常简单,只需要调用其构造函数即可: ```java Timer timer = new Timer(); ``` ### 2. 定时任务的...

    Timer定时任务

    接下来,我们可以使用`Timer`的`schedule`方法安排任务执行。例如,若希望任务在指定的延迟后执行一次,可以这样写: ```java timer.schedule(new MyTask(), delay); ``` 如果希望任务周期性执行,可以使用`...

    java_Timer定时器实例_Spring实例

    Java的`java.util.Timer`类用于调度线程在特定时间执行任务,它提供了两种任务执行方式:`schedule()`和`scheduleAtFixedRate()`。前者用于定期执行任务,但每次执行之间的时间间隔可能因任务执行时间而有所不同;后...

    远程获取网页数据并分析

    这两个方法的主要区别在于`scheduleAtFixedRate()`会保证两次任务执行之间的间隔固定,即使上一次任务执行超时,而`schedule()`则只保证下一次任务在指定时间开始,不考虑前一次任务的执行时间。 接着是`TimerTask`...

    解析Java中的Timer和TimerTask在Android中的用法和实例

    【Java中的Timer和TimerTask在Android中的应用】 在Android开发中,我们经常遇到需要定期执行某项任务的情况,如更新UI、发送心跳包等。这时,Java提供的Timer和TimerTask类就显得非常实用。这两个类可以帮助我们在...

    android 应用 源代码——定时器

    `Timer`类提供了`schedule`和`scheduleAtFixedRate`这两个主要的方法来安排任务。 1. `schedule(TimerTask task, long delay)`:此方法会在延迟`delay`毫秒后执行指定的`TimerTask`。 2. `scheduleAtFixedRate...

    Java定时器的使用 Java程序

    - `scheduleAtFixedRate`与`schedule`的区别在于,前者在任务执行超时时会尝试保持固定的执行间隔,而后者不会。 ### 6. 实际应用 在实际开发中,Java定时器常与其他框架结合使用,如Spring的`@Scheduled`注解或...

    定时器的使用可实现具体任务

    3. **调度定时任务**:使用`Timer`对象的`schedule()`方法来安排任务的执行时间。 - `schedule(TimerTask task, long delay)`:表示在`delay`毫秒后执行一次任务。 - `schedule(TimerTask task, Date time)`:表示...

    几种任务调度的Java实现方法与比较

    创建一个 `Timer` 对象后,可以通过 `schedule()` 方法来安排任务的执行。值得注意的是,由于 `Timer` 使用单个后台线程来执行所有的任务,所以当其中一个任务出现异常时,可能会导致其他任务无法正常执行。 #### ...

    JAVA定时器

    这篇博文可能是分析了这两种定时器的使用方法和源码解析。 `java.util.Timer` 是Java早期提供的定时器,它通过`TimerTask`类来定义需要定时执行的任务。创建一个`Timer`实例后,可以调用`schedule(TimerTask task, ...

    Java任务调度.pdf

    例如,可以创建一个`TimerTask`子类,在其`run()`方法中编写代码来预处理这些数据,然后使用`Timer`类的`scheduleAtFixedRate()`方法将其安排在每天凌晨的低峰时段自动运行。这样,系统就能在用户访问之前准备好所需...

    JAVA定时运行程序

    - 使用`scheduleAtFixedRate`方法安排当前任务以固定的周期(每分钟)执行。 - 代码示例: ```java public void start() { timer.scheduleAtFixedRate(this, new Date(), 1000 * 60); } ``` ##### 4.2 `run...

    解析Java中的定时器及使用定时器制作弹弹球游戏的示例

    `Timer`提供的`schedule`方法家族允许我们灵活地设置任务的执行时间和间隔。 例如,`schedule(TimerTask task, long delay)`方法会在延迟`delay`毫秒后执行指定的`TimerTask`任务。`schedule(TimerTask task, long ...

    JAVA定时任务

    通过实现`Runnable`或`Callable`接口并使用`ScheduledExecutorService`的`schedule`、`scheduleAtFixedRate`和`scheduleWithFixedDelay`方法来安排任务。 2. **Timer和TimerTask** 在较早的Java版本中,`java.util...

    Matlab及Java实现小时钟效果

    - 创建一个 `Timer` 对象,使用 `scheduleAtFixedRate` 或 `schedule` 方法定期执行 `TimerTask`。 5. **运行程序**: - 设置主窗口可见,启动定时器,程序开始运行。 两种语言的实现方式虽然不同,但核心思想都...

    几种任务调度的用法

    ### 几种任务调度的Java实现方法与比较 #### 引言 随着互联网技术的不断发展,Web应用变得越来越复杂和多样化。为了满足不同场景的需求,许多应用需要支持定时任务的调度,例如定时发送邮件、定时刷新数据等。本文...

    java日期操作大全

    通过`schedule(TimerTask task, long delay)`或`scheduleAtFixedRate(TimerTask task, Date firstTime, long period)`等方法,可以实现定时任务的调度。 6. **其他日期操作**: Java 8引入了`java.time`包,提供了...

Global site tag (gtag.js) - Google Analytics