在这篇关于程序员相信时间的谎言的有趣文章中,其中之一是
Thread.sleep(1000) 睡眠 >= 1000 毫秒。
这什么时候不是真的?
根据this(windows操作系统的sleep实现,就是Thread.sleep下面会调用的):如果dwMilliseconds小于系统时钟的分辨率,线程可能会休眠小于指定的时间长度。如果 dwMilliseconds 大于 1 个滴答但小于 2 个滴答,则等待可能介于 1 到 2 个滴答之间,依此类推。要提高睡眠间隔的准确性,请调用timeGetDevCaps函数以确定支持的最小计时器分辨率,并调用 timeBeginPeriod函数将计时器分辨率设置为最小值。
操作系统仅在中断时做出反应,因此在中断时处理睡眠到期。可以通过 增加中断频率是正确的timeBeginPeriod
。难点在于Sleep()
函数的到期需要满足两个条件:
条件2是这里的问题。dwMilliseconds将与中断时的过期系统时间进行比较。系统时间将导致Sleep()
函数以文件时间格式增量过期,换句话说,当系统时间增量的 n 倍变得大于dwMilliseconds 时。因此,人们可能永远无法获得 1 毫秒的睡眠延迟。这在很大程度上取决于系统的硬件和软件以及配置(系统时间增量/粒度)。
回答这个问题: Thread.sleep(1000) sleeps for >= 1000 毫秒总是正确的!编辑:在 Thread.sleep(1) 之后立即执行时
编辑:但是 Thread.sleep(1) 睡眠时间 >= 1 毫秒可能并不总是 TRUE