6

プログラマーが時間について信じている虚偽についてのこの興味深い記事では、そのうちの1つは

Thread.sleep(1000)は、1000ミリ秒以上スリープします。

これはいつ真実ではないのですか?

4

2 に答える 2

4

これによると(Windowsオペレーティングシステムによるスリープの実装。これは、Thread.sleepがその下で呼び出すものです):dwMillisecondsがシステムクロックの解像度よりも小さい場合、スレッドは指定された時間よりも短い時間スリープする可能性があります。dwMillisecondsが1ティックより大きく、2ティック未満の場合、待機は1〜2ティックの間のどこかになります。スリープ間隔の精度を上げるには、timeGetDevCaps関数を呼び出してサポートされている最小タイマー解像度を決定し、timeBeginPeriod関数を呼び出して、タイマー解像度を最小に設定します。

于 2012-07-07T16:02:14.307 に答える
4

OSは割り込み時にのみ反応するため、割り込み時にスリープの有効期限を処理します。インターラップ周波数は、を使用して増やすことができるのは正しいことですtimeBeginPeriod。難しいのは、Sleep()関数の有効期限が2つの条件を満たす必要があることです。

  1. 割り込みが発生する必要があります
  2. dwMillisecondsの有効期限が切れている必要があります。

ここでの問題は条件2です。dwMillisecondsは、割り込み時に期限切れのシステム時間と比較されます。システム時間により、Sleep()関数はファイル時間形式の増分で期限切れになります。つまり、システム時間の増分がn倍になるとdwMillisecondsより大きくなります。したがって、1msの睡眠遅延を得ることができない場合があります。これは、システムのハードウェアとソフトウェアおよび構成(システム時間の増分/粒度)に大きく依存します。

いくつかの例を詳しく見ると、ここにあります

質問に答えるには:Thread.sleep(1000)が1000ミリ秒以上スリープするのは常にTRUEです!編集:Thread.sleep(1)の直後に実行された場合

編集:ただし、Thread.sleep(1)が1ミリ秒以上スリープすると、常にTRUEになるとは限りません。

于 2012-07-09T07:07:09.803 に答える