-
定时器任务 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个答案 按时间排序 按投票排序
-
采纳的答案
这是因为Timer基本处理模型是单线程调度的任务队列模型,Timer不停地接受调度任务,所有任务接受Timer调度后加入TaskQueue,TimerThread不停地去TaskQueue中取任务来执行.此种方式的不足之处为当某个任务执行时间较长,以致于超过了TaskQueue中下一个任务开始执行的时间,会影响整个任务执行的实时性。
你可以试用scheduleAtFixedRate方法,它会让任务尽量保证在规定的时间频率执行,如:定的时间频率是2s,因为系统繁忙,之后的2.5秒后任务才得以执行第二次,然后,Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么,1.5秒后,任务将执行.2012年12月04日 14:43
-
对于简单的而且实时性不高的任务,可以采用Timer来完成。但是该类在API中也说明了,不能保证触发的时间是正确的。
目前企业开发方面,大多采用quartz。该框架可以满足你的各种需求,而且使用配置也不难。建议采用该方式!2012年12月04日 20:43
-
1、Timer
引用与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。
所以如果任务多可能造成延迟
2、此类不 提供实时保证 所以晚几秒很正常
3、
public void schedule(TimerTask task,
long delay,
long period)
引用安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。
在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。
固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。
所以不适合你的任务。 可以考虑 quartz。2012年12月04日 17:02
-
堵塞了。是不是用了多进程之类的啊,可能会存在堵塞。还有一种可能是上次的任务还没有执行完,然后这次任务也启动了,也会存在这种问题的。建议优化一下代码,然后定时尽量把时间隔开点,保证任务很在某个时间范围内执行完。最后还有一个可能,检查服务器的时间,是不是服务器时间和你本机对不上。
2012年12月04日 14:23
-
引用
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
TIA博途中编写的定时器Timer为什么不工作?
vc 定时器 Timer 多媒体定时器 毫秒 ms
VS2019 Timer定时器例程
C#定时器(Timer)实现了随着时间的变化,代码自动运行,以改变界面顔色的方式表达定时器
下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。 需要注意的问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新...
java 定时器(Timer) java 定时器(Timer) java 定时器(Timer)
Spring使用timer定时器-能精确几点运行定时任务的小demo
spring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rarspring定时器Timer.rar
我们通常写的timer都是用main方法写的定时器,但同样我们也需要根据服务器启动后定时器也启动的 定时执行任务。不过有个致命伤就是集群方面跟quartz不能比,此方法代码做参考不错,如果要用,那么这个方法在一台...
定时器Timer实例,直接看代码说明,代码详细
本文实例讲述了C#定时器实现自动执行的方法。分享给大家供大家参考。具体实现方法如下: 代码如下: //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers...
java定时器,timer类操作详解 java定时器,timer类操作详解
c# ScheduleTimer_src 自定义 c# ScheduleTimer_src
单片机定时器汇编程序,含注释,单片机定时器程序汇编含注释,单片机实现定时器含注释,汇编语言有注释单片机定时器汇编程序
Delphi通过多个Timer控件执行多任务..rar
VC++ 例子,一个程序中使用多个定时器(Timer)的例子
适合作为学生实验参考,开发工具为arm7
STM32L4定时器(TIMER)介绍