Multithreading Thread.sleep(1000)何时睡眠时间少于1000毫秒?

Multithreading Thread.sleep(1000)何时睡眠时间少于1000毫秒?,multithreading,time,sleep,Multithreading,Time,Sleep,在这篇关于的有趣文章中,其中之一是 Thread.sleep(1000)睡眠时间>=1000毫秒 这不是真的吗?根据(由windows操作系统实现睡眠,这是Thread.sleep将在下面调用的):如果dwMillimes小于系统时钟的分辨率,则线程的睡眠时间可能小于指定的时间长度。如果DWM大于一个刻度但小于两个,则等待时间可以在一到两个刻度之间,依此类推。要提高睡眠间隔的准确性,请调用函数以确定支持的最小计时器分辨率,并调用函数将计时器分辨率设置为其最小值。操作系统仅在中断时作出反应,因此在

在这篇关于的有趣文章中,其中之一是

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


这不是真的吗?

根据(由windows操作系统实现睡眠,这是Thread.sleep将在下面调用的):如果dwMillimes小于系统时钟的分辨率,则线程的睡眠时间可能小于指定的时间长度。如果DWM大于一个刻度但小于两个,则等待时间可以在一到两个刻度之间,依此类推。要提高睡眠间隔的准确性,请调用函数以确定支持的最小计时器分辨率,并调用函数将计时器分辨率设置为其最小值。

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

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

    可以通过一些示例进行更仔细的查看

    回答以下问题:Thread.sleep(1000)睡眠时间>=1000毫秒始终为真! 编辑:在线程之后执行。睡眠(1)


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

    这似乎有点像“编程民间传说”列表。虽然那里的大部分内容都相当明显,但我没有看到任何具体的证据来支持。让我补充一点,计时器可能会在时间结束之前触发。引用本身在实时操作系统之外没有任何意义。回答这个问题需要一个简单的场景:实时时钟可以调整,因此睡眠更少。下一个非常明显的例子是,由于操作系统信号,线程可能会偶尔被唤醒。@bestsss-我忘记了Java臭名昭著的虚假唤醒。但这不是Java,它是操作系统的一个功能。你能澄清一下链接源中说睡眠(1)可能在毫秒以下返回的部分吗?我读了源代码,它似乎根本没有这么说。@CameronBielstein:正如这里的公认答案中所写的:如果dwms小于系统时钟的分辨率,线程的睡眠时间可能小于指定的时间长度。