6

在这篇关于程序员相信时间的谎言的有趣文章中,其中之一是

Thread.sleep(1000) 睡眠 >= 1000 毫秒。

这什么时候不是真的?

4

2 回答 2

4

根据this(windows操作系统的sleep实现,就是Thread.sleep下面会调用的):如果dwMilliseconds小于系统时钟的分辨率,线程可能会休眠小于指定的时间长度。如果 dwMilliseconds 大于 1 个滴答但小于 2 个滴答,则等待可能介于 1 到 2 个滴答之间,依此类推。要提高睡眠间隔的准确性,请调用timeGetDevCaps函数以确定支持的最小计时器分辨率,并调用 timeBeginPeriod函数将计时器分辨率设置为最小值。

于 2012-07-07T16:02:14.307 回答
4

操作系统仅在中断时做出反应,因此在中断时处理睡眠到期。可以通过 增加中断频率是正确的timeBeginPeriod。难点在于Sleep()函数的到期需要满足两个条件:

  1. 必须发生中断
  2. dwMilliseconds必须过期。

条件2是这里的问题。dwMilliseconds将与中断时的过期系统时间进行比较系统时间将导致Sleep()函数以文件时间格式增量过期,换句话说,当系统时间增量的 n 倍变得大于dwMilliseconds 时。因此,人们可能永远无法获得 1 毫秒的睡眠延迟。这在很大程度上取决于系统的硬件和软件以及配置(系统时间增量/粒度)。

可以在这里找到一些示例的仔细查看

回答这个问题: Thread.sleep(1000) sleeps for >= 1000 毫秒总是正确的!编辑:在 Thread.sleep(1) 之后立即执行时

编辑:但是 Thread.sleep(1) 睡眠时间 >= 1 毫秒可能并不总是 TRUE

于 2012-07-09T07:07:09.803 回答