Thread.sleep等待超过预期

时间:2011-05-23 10:07:14

标签: java multithreading thread-sleep

以下代码:

long msBefore = System.currentTimeMillis();
//Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
try
{Thread.sleep(200);
} catch (InterruptedException e){}
System.out.println("Time: " + (System.currentTimeMillis() - msBefore));

打印:

Time: 578
Time: 594
Time: 625
Time: 640
Time: 641
Time: 609
Time: 625
Time: 625
Time: 610
Time: 609
Time: 625
Time: 625
Time: 422
Time: 625
Time: 594
Time: 609
Time: 625
Time: 594
Time: 594
Time: 625

问题出在哪里?

4 个答案:

答案 0 :(得分:8)

  

我要求每秒发送n条消息,我认为等待/通知不合适,对吗?

如果您有严格的时间要求,那么您将需要使用real-time Java 实施。主流SE和ME Java实现不适用于硬实时应用程序。

您可以使用各种技巧来“满足”大多数时间“的要求......但如果您的应用程序/系统过载,您可能会开始错过所需的消息率。

真正的问题不在于定时器的准确性,而是非实时调度程序不会(也不能)保证在定时器到期后安排线程运行的事实。

答案 1 :(得分:7)

这里没有问题。来自javadoc:

  

受制于系统的准确性   调度器。

通常,依赖休眠间隔是不好的设计,因为它在不同的系统和JVM实现上可能不同。改为使用wait()和notify(),或者更好 - 使用java.util.concurrent包。

答案 2 :(得分:0)

您没有考虑处理时间。

    try {
        long processingStart = System.currentTimeMillis();

        long processingFinish = System.currentTimeMillis();
        long processTime = 600 - (processingFinish - processingStart);
        Thread.sleep(processTime);

    } catch (InterruptedException ex) {

    }

答案 3 :(得分:0)

如果您确实需要固定的消息速率,请执行类似自旋锁的操作。它会占用单CPU核心,但会让你接近。

long nextTime = System.currentTimeMillis() + interval;
while (keepRunning) {
   while (nextTime - System.currentTimeMillis() > 0)
       ;
   sendMessage();
   nextTime += interval;
}