風吹落叶 2012-12-04 14:12
浏览 697
已采纳

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

[color=red]//创建一个定时器,在下一小时的第30分种第一次执行,然后每小时执行一次。[/color]
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);
}

[color=red]//任务task[/color]
public class CollegeIPTask extends TimerTask {
public CollegeIPTask() {
}

    @Override
    public void run() {
        try{
             //业务逻辑
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}
[color=red]第一次任务没问题,但是从第二次开始没次任务都晚几秒执行,还有到第二天0点的时候直接0点50多分钟才执行,1点的时候直接就2点多才执行,怎么回事?[/color]

  • 写回答

5条回答 默认 最新

  • iteye_7115 2012-12-04 14:43
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?