プログラマーが時間について信じている虚偽についてのこの興味深い記事では、そのうちの1つは
Thread.sleep(1000)は、1000ミリ秒以上スリープします。
これはいつ真実ではないのですか?
これによると(Windowsオペレーティングシステムによるスリープの実装。これは、Thread.sleepがその下で呼び出すものです):dwMillisecondsがシステムクロックの解像度よりも小さい場合、スレッドは指定された時間よりも短い時間スリープする可能性があります。dwMillisecondsが1ティックより大きく、2ティック未満の場合、待機は1〜2ティックの間のどこかになります。スリープ間隔の精度を上げるには、timeGetDevCaps関数を呼び出して、サポートされている最小タイマー解像度を決定し、timeBeginPeriod関数を呼び出して、タイマー解像度を最小に設定します。
OSは割り込み時にのみ反応するため、割り込み時にスリープの有効期限を処理します。インターラップ周波数は、を使用して増やすことができるのは正しいことですtimeBeginPeriod
。難しいのは、Sleep()
関数の有効期限が2つの条件を満たす必要があることです。
ここでの問題は条件2です。dwMillisecondsは、割り込み時に期限切れのシステム時間と比較されます。システム時間により、Sleep()
関数はファイル時間形式の増分で期限切れになります。つまり、システム時間の増分がn倍になるとdwMillisecondsより大きくなります。したがって、1msの睡眠遅延を得ることができない場合があります。これは、システムのハードウェアとソフトウェアおよび構成(システム時間の増分/粒度)に大きく依存します。
いくつかの例を詳しく見ると、ここにあります
質問に答えるには:Thread.sleep(1000)が1000ミリ秒以上スリープするのは常にTRUEです!編集:Thread.sleep(1)の直後に実行された場合
編集:ただし、Thread.sleep(1)が1ミリ秒以上スリープすると、常にTRUEになるとは限りません。