0 0

定时器任务 timer.schedule为什么每次任务都晚几秒执行,还有到第二天0点的时候都晚50多分钟?15

//创建一个定时器,在下一小时的第30分种第一次执行,然后每小时执行一次。
private void startCollegeIPDay(){
    Timer timer = new Timer(true);
      long day =  24 * 60 * 60 * 1000;
   Calendar calendar = Calendar.getInstance();
   calendar.add(Calendar.DATE, 1);
   calendar.set(Calendar.HOUR_OF_DAY, 0);
   calendar.set(Calendar.MINUTE, 55);
   calendar.set(Calendar.SECOND, 0);
   timer.schedule(new CollegeDayIPTask(), calendar.getTime(), day);
    }

//任务task
public class CollegeIPTask extends TimerTask {
public CollegeIPTask() {
    }
  
    @Override
    public void run() {
    try{
             //业务逻辑
    }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
第一次任务没问题,但是从第二次开始没次任务都晚几秒执行,还有到第二天0点的时候直接0点50多分钟才执行,1点的时候直接就2点多才执行,怎么回事?

问题补充:代码考错了,
calendar.set(Calendar.MINUTE, 55);
应该是 30分钟执行,但是考成55的那个任务了.
不过不影响.我执行的就是30分钟执行的那个,而且55那个任务都关了
2012年12月04日 14:12

5个答案 按时间排序 按投票排序

0 0

采纳的答案

这是因为Timer基本处理模型是单线程调度的任务队列模型,Timer不停地接受调度任务,所有任务接受Timer调度后加入TaskQueue,TimerThread不停地去TaskQueue中取任务来执行.此种方式的不足之处为当某个任务执行时间较长,以致于超过了TaskQueue中下一个任务开始执行的时间,会影响整个任务执行的实时性。

你可以试用scheduleAtFixedRate方法,它会让任务尽量保证在规定的时间频率执行,如:定的时间频率是2s,因为系统繁忙,之后的2.5秒后任务才得以执行第二次,然后,Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么,1.5秒后,任务将执行.

2012年12月04日 14:43
0 0

对于简单的而且实时性不高的任务,可以采用Timer来完成。但是该类在API中也说明了,不能保证触发的时间是正确的。
目前企业开发方面,大多采用quartz。该框架可以满足你的各种需求,而且使用配置也不难。建议采用该方式!

2012年12月04日 20:43
0 0

1、Timer

引用
与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

所以如果任务多可能造成延迟

2、此类不 提供实时保证  所以晚几秒很正常

3、
public void schedule(TimerTask task,
                     long delay,
                     long period)

引用
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。
在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。

固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。


所以不适合你的任务。 可以考虑 quartz。

2012年12月04日 17:02
0 0

堵塞了。是不是用了多进程之类的啊,可能会存在堵塞。还有一种可能是上次的任务还没有执行完,然后这次任务也启动了,也会存在这种问题的。建议优化一下代码,然后定时尽量把时间隔开点,保证任务很在某个时间范围内执行完。最后还有一个可能,检查服务器的时间,是不是服务器时间和你本机对不上。

2012年12月04日 14:23
0 0

引用

Timer timer = new Timer(true);
      long day =  24 * 60 * 60 * 1000;
   Calendar calendar = Calendar.getInstance();
   calendar.add(Calendar.DATE, 1);
   calendar.set(Calendar.HOUR_OF_DAY, 0);
   calendar.set(Calendar.MINUTE, 55);
   calendar.set(Calendar.SECOND, 0);
   timer.schedule(new CollegeDayIPTask(), calendar.getTime(), day);

我看这个代码的意思是:从第二天开始,每天的0:55执行一次,

2012年12月04日 14:21

相关推荐

    Java定时器Timer简述.pdf

    Java定时器Timer是Java编程语言中用于计划执行任务的一种工具类。Timer类主要提供了定时任务的安排执行,对于需要在指定时间后、或者以固定周期重复执行任务的场景非常有用。本文档中介绍的Timer类的实现以及如何...

    定时器Timer实例.rar

    `Timer`提供了几种方法来安排任务,如`schedule(TimerTask task, long delay)`和`schedule(TimerTask task, Date firstTime, long period)`,分别用于延迟执行和周期性执行。 2. **TimerTask类**: `java.util....

    java 定时器(Timer)

    - 创建Timer对象:`Timer(int delay, ActionListener listener)`,其中`delay`参数代表第一次执行任务前的等待时间(以毫秒为单位),`listener`参数是当计时器触发时执行的动作监听器。 - 启动定时器:`timer....

    vc 定时器 Timer 多媒体定时器 毫秒 ms

    在VC++编程环境中,定时器(Timer)是一个非常重要的组件,它允许程序在特定时间间隔后执行特定的任务。本文将深入探讨VC++中的定时器机制,特别是多媒体定时器(Multimedia Timer),以及如何处理毫秒级的时间精度...

    C#定时器(Timer)

    C#定时器(Timer)是.NET框架中一个非常重要的组件,它允许开发者在特定的时间间隔内执行特定的代码块,从而实现周期性的任务。在Windows应用程序、服务或控制台程序中,C#定时器常常被用来创建后台任务、监控、更新...

    java的定时器使用方法.txt

    - 类似于`schedule(TimerTask task, long delay, long period)`,但保证了每次任务执行之间的间隔固定为`period`,即使某次任务执行时间较长也不会影响下一次任务的执行时间。 - **示例**: ```java Timer timer...

    c# ScheduleTimer_src

    标题 "c# ScheduleTimer_src" 暗示我们正在探讨一个使用C#语言实现的定时器(ScheduleTimer)源代码项目。这个项目可能包含了自定义的定时器类和相关功能,用于在特定时间执行任务。 描述 "c# ScheduleTimer_src ...

    java定时器(timer类使用详解)

    Java定时器,也被称为`Timer`类,是Java标准库中的一个强大工具,它允许开发者在指定的时间间隔执行任务,从而实现定时操作。这个类在`java.util`包中定义,是实现定时任务调度的核心。在本文中,我们将深入探讨`...

    VS2019 Timer定时器例程MFCApplicationTimerDemTest.rar

    在本文中,我们将深入探讨如何在Visual Studio 2019 (VS2019) 中使用MFC(Microsoft Foundation Class)库创建一个基于C++的Timer定时器应用。MFC是微软为Windows应用程序开发提供的一组C++类库,它简化了Windows ...

    java定时器timer制作

    根据给定的信息,本文将详细解析Java定时器的制作及应用,同时对比.NET中的三种不同类型的定时器,以便更好地理解定时任务的实现方式及其特点。 ### Java定时器基础 Java中定时器(Timer)主要用于执行周期性的...

    TIA博途中编写的定时器Timer为什么不工作?.docx

    在TIA博途中,定时器Timer是自动化编程中不可或缺的一部分,它们用于实现延时操作、周期性任务或者根据设定的时间间隔触发某些功能。然而,有时我们可能会遇到定时器不工作的现象,这通常是由多种因素引起的。针对...

    Timer定时器的使用方法

    【Timer定时器的使用方法】 在Java编程语言中,`java.util.Timer` 和 `java.util.TimerTask` 类是用于执行定期或延时任务的核心组件。它们允许开发者在指定的时间间隔内执行特定的操作,这对于实现定时任务,如定时...

    定时器timer.rar

    在嵌入式系统开发中,定时器(Timer)是一个至关重要的组成部分,特别是在基于ARM7处理器的平台上。定时器不仅用于精确的时间控制,还扮演着事件调度、中断触发等多种角色。本实验资料“定时器timer.rar”是专为学生...

    java写定时任务,定时任务、定时器详细示例.pdf

    例如,`timer.schedule(task, delay, period)`会延迟`delay`毫秒后开始执行任务,并以`period`毫秒为间隔重复执行。 三、`TimerTask`的其他方法 - `boolean cancel()`: 取消一个已经安排好的任务,使其不再执行。 ...

    java timer定时器详解(附详细代码)

    在上面的例子中,我们创建了一个Timer对象,然后使用schedule方法来执行多个任务。最后,我们使用cancel方法来停止所有任务的执行。 结论 Java Timer定时器是一种非常有用的机制,可以帮助开发者实现一些需要在...

    android定时器Timer实例

    在Android开发中,有时我们需要执行一些任务,但不希望这些任务立即执行,而是希望它们在特定的时间点或者按照一定的间隔周期性地运行。这就是定时器(Timer)的作用。本篇文章将详细探讨Android中的Timer类以及如何...

    Java定时器Timer简述共8页.pdf.zip

    Java定时器(Timer)是Java语言提供的一种用于执行定时任务的工具类,它位于java.util包下。在Java编程中,我们有时需要在特定的时间间隔内执行某些操作,例如每隔一段时间更新数据、发送通知或者执行定期维护等。这...

    多个定时器的例子 Timer VC++

    在VC++编程环境中,创建和使用多个定时器是常见的需求,特别是在开发实时性强、需要定时执行某些任务的应用程序中。本示例“多个定时器的例子 Timer VC++”旨在展示如何在一个程序中有效地管理并利用多个定时器。...

Global site tag (gtag.js) - Google Analytics