Thread.sleep等待超过预期

Muh*_*edy 9 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));
Run Code Online (Sandbox Code Playgroud)

印刷品:

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
Run Code Online (Sandbox Code Playgroud)

问题出在哪里?

Ste*_*n C 8

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

如果您有一个硬时序要求,那么您将需要使用实时Java实现.主流SE和ME Java实现不适用于硬实时应用程序.

您可以使用各种技巧"大部分时间"来满足这些要求......但如果您的应用程序/系统过载,您可能会开始错过所需的消息速率.

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


Vla*_*nov 7

这里没有问题.来自javadoc:

受制于系统和调度程序的准确性.

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

  • wait/notify使用与sleep相同的计时器.它同样准确. (3认同)
  • 真正的问题不是计时器的准确性。问题是保证线程在计时器到期时立即被调度。这实际上是不可能的……除非您在支持实时的操作系统上使用实时 Java。 (2认同)