Java Thread.sleep比计划的时间更早地“醒来”

时间:2011-02-18 19:00:27

标签: java multithreading

我需要编写一个守护进程,它启动在不同时间唤醒的线程数。守护进程使用commons apache库用Java编写,并在Linux机器(Fedora 13)上运行。 一个线程每天唤醒以执行按计划发生的任务A. 但还有另一个线程计划在每个星期一早上6点起床,以执行一些未按计划发生的任务。问题是这个线程在实际的预定时间之前醒来了很多。它在上一次运行完成后运行2天,但它应该仅在一周后运行。等待时间是使用我们自己的计时器类正确计算的,因为这会重用现有代码,我没有看到这个问题。

这可能是什么问题?

由于

1 个答案:

答案 0 :(得分:9)

Thread.sleep()不做任何保证,它可能比预期更早醒来。你应该总是在循环中使用它:

long curTime = System.currentTimeMillis();

while (wakeUpTime - curTime > 0) {
  try {
    Thread.sleep(wakeUpTime - curTime);
  } catch (InterruptedException ex) { }
  curTime = System.currentTimeMillis();
}