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 

问题出在哪里?

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

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

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

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

这里没有问题。 来自javadoc:

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

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

你没有考虑它花在处理上的时间。

  try { long processingStart = System.currentTimeMillis(); long processingFinish = System.currentTimeMillis(); long processTime = 600 - (processingFinish - processingStart); Thread.sleep(processTime); } catch (InterruptedException ex) { } 

如果您确实需要固定的消息速率,请实现类似自旋锁的function。 它将消耗单CPU核心,但让你接近。

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