在这篇关于falsehoods programmers believe about time的有趣文章中,其中一篇是
Thread.sleep(1000)睡眠时间>> = 1000毫秒。
什么时候不是这样?
答案 0 :(得分:4)
根据this(通过Windows操作系统实现睡眠,这是Thread.sleep将在下面调用的):如果dwMilliseconds小于系统时钟的分辨率,则线程可能睡眠时间小于指定的时间长度。如果dwMilliseconds大于一个tick但小于2,则等待可以是一到两个滴答之间的任何位置,依此类推。要提高休眠间隔的准确性,请调用timeGetDevCaps函数以确定支持的最小计时器分辨率,并调用timeBeginPeriod函数将计时器分辨率设置为最小值。
答案 1 :(得分:4)
OS仅在中断时作出反应,因此在中断时处理睡眠到期。通过timeBeginPeriod
可以增加中断频率是正确的。困难在于Sleep()
函数的到期需要满足两个条件:
条件2是这里的问题。 dwMilliseconds 将与中断时过期的系统时间进行比较。系统时间将导致Sleep()
函数以文件时间格式递增到期,换句话说,当系统时间增量的n倍大于 dwMilliseconds 时。因此,人们可能无法获得1ms的睡眠延迟。这严重依赖于系统的硬件和软件及配置(系统时间增量/粒度)。
仔细查看一些示例here
回答这个问题:Thread.sleep(1000)睡眠为> = 1000毫秒始终为TRUE! 编辑:在Thread.sleep(1)
之后执行编辑:但是Thread.sleep(1)睡眠为> = 1毫秒可能并不总是为真