在 Windows 上为 Java 提供准确的睡眠

2022-09-02 00:27:32

有谁知道一个为Java提供Thread.sleep()的库,其错误不大于1-2毫秒?

我尝试了睡眠,误差测量和BusyWait的混合,但我在不同的Windows机器上都不可靠。

如果该实现也可用于Linux和MacOS,则该实现可以是本机实现。

编辑Nick提供的链接(http://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks)是一个非常好的资源,可以理解Java的各种计时器/睡眠/时钟的问题。


答案 1

要提高睡眠粒度,您可以从此 Thread.sleep 页面尝试以下操作。

Windows 下 Thread.sleep() 的错误

如果时序对你的应用程序至关重要,那么解决这些错误的一种不雅但实用的方法是让一个守护程序线程在整个应用程序的整个持续时间内运行,该线程只是休眠大量质数毫秒(Long.MAX_VALUE就可以了)。这样,每次调用应用程序时,中断周期将设置一次,从而最大限度地减少对系统时钟的影响,并将休眠粒度设置为 1ms,即使默认中断周期不是 15ms。

该页面还提到,它会导致系统范围的Windows更改,这可能会导致用户的时钟由于此错误而快速运行。

编辑

有关此内容的更多信息,请参阅此处,以及来自 Sun 的相关错误报告


答案 2

这迟到了大约5个月,但可能对阅读这个问题的人有用。我发现这与纳秒精度相同(理论上),并且比实际精度好得多。这当然取决于你正在使用的Java运行时,所以YMMV。java.util.concurrent.locks.LockSupport.parkNanos()Thread.sleep()Thread.sleep()

看看:LockSupport.parkNanos

(我在Sun的1.6.0_16-b01 VM for Linux上验证了这一点)