残念ながら、Java 6の時点では、Windows OSのすべてのJavaスリープ関連メソッド(LockSupport.awaitNanos()を含む)は、上記の何人かの人々が述べたように、ミリ秒に基づいています。
正確な間隔を数える1つの方法は、「スピンイールド」です。System.nanoTime()メソッドは、かなり正確な相対時間カウンターを提供します。この通話の費用はハードウェアによって異なり、2000〜50ナノ秒のどこかにあります。
Thread.sleep()の代替案を次に示します。
public static void sleepNanos (long nanoDuration) throws InterruptedException {
final long end = System.nanoTime() + nanoDuration;
long timeLeft = nanoDuration;
do {
if (timeLeft > SLEEP_PRECISION)
Thread.sleep (1);
else
if (timeLeft > SPIN_YIELD_PRECISION)
Thread.yield();
timeLeft = end - System.nanoTime();
} while (timeLeft > 0);
}
このアプローチには1つの欠点があります。待機ヒットCPUコアの最後の2〜3ミリ秒の間です。sleep()/ yield()は他のスレッド/プロセスと共有することに注意してください。CPUの少しを妥協することをいとわないなら、これはあなたに非常に正確な睡眠を与えます。