2013-03-27 18 views
1

我正在使用TimerTask调度每日运行的线程。这是代码。在java中使用TimerTask调度的不寻常延迟

private void scheduleDailyProcess() { 
    Calendar c = Calendar.getInstance(); 
    c.add(Calendar.DATE, 1); 
    c.set(Calendar.HOUR_OF_DAY, 0); 
    c.set(Calendar.MINUTE, 5); 
    c.set(Calendar.SECOND, 0); 
    c.set(Calendar.MILLISECOND, 0); 

    Timer timer = new Timer(); 

    int period = 24 * 60 * 60 * 1000; //24 hours 
    timer.schedule(new DailyProcess(), c.getTime(), period); 
} 

我希望线程在每天凌晨00:05运行。但是我注意到该线程以8秒的未指定延迟开始。

我在代码中丢失了什么吗?或者TimerTask有问题吗?

日常过程中没有延迟。

+0

你从哪里得到你的三角洲?你的程序中有计时打印吗? – Max 2013-03-27 14:15:14

+0

是的,我可以从日志中看到8秒的延迟。 – 2013-03-27 14:21:21

+0

'TimerTask'不保证精确的执行时间。事实上,文档对此非常明确。如果你需要精确度,我建议使用Quartz框架 - > http://quartz-scheduler.org/。 – 2013-03-27 15:52:31

回答

1

在执行此任务之前可能还有别的东西在运行,延迟了DailyProcess的初始执行。

按照TimerTask的文档

对应每一个定时器对象是用来 执行所有的定时器的任务,依次单个后台线程。计时器任务应该快速完成。如果一个计时器任务需要花费过多时间才能完成,它会“占用”计时器的任务执行线程。反过来,这可能会延迟后续任务的执行,这些任务可能会“聚集起来”并在(如果)违规任务最终完成时快速连续执行。

+0

DailyProcess是由此计时器对象执行的唯一线程。在之前或之后没有其他的TimerTask。 – 2013-03-27 14:22:54

+0

请仔细阅读有关TimerTask的文档。当系统试图在指定的时间运行任务时,不能保证它会在您指定时正确运行,并且有几个因素会导致一些漂移。如果日常任务中的8秒偏移对于您的任务不可接受,那么您可能无法依赖TimerTask。 – JohnnyO 2013-03-27 15:01:15

+0

延迟8秒对我来说是可以接受的。感谢您的澄清。 – 2013-03-27 17:07:24