1

これが私のコードです

try{

  System.out.println("Before");
  thread.sleep(10000);//sleep for 10000 ms
  System.out.println("After");

}
catch(ItrerruptedException ie){
//If this thread was intrrupted by nother thread 
}

スレッドが正確に 10 秒間スリープしてから印刷するかどうか、Afterまたは遅延があるかどうかを知りたいだけですか?

4

6 に答える 6

4

javadocs から:Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.つまり、少なくとも 10 秒間スリープします。スケジューラーが 10 秒が経過した後に実行しないことを決定した場合、スリープ時間が長くなる可能性があります。
これは、より多くの並行スレッドが同時に実行可能なプールにある場合に発生する可能性があります。

于 2012-05-08T14:45:46.997 に答える
3

非リアルタイム スケジューラは、タイミングを保証しません。

本当にタイミングに依存する何らかのハードウェア通信を行っている場合は、おそらくRTSJを使用する必要があります。

x ミリ秒ごとに何かを実行している場合は、TimeTaskを使用するとパフォーマンスがわずかに向上します。

于 2012-05-08T15:03:18.727 に答える
2

少なくとも 10 秒間スリープ状態になり、(中断されない限り) すぐにスリープ状態になります。どのくらいの時間が経過するかは、OS とマシンの負荷によって異なります。

于 2012-05-08T14:43:59.210 に答える
0

スリープから実行までのスレッドのオーバーヘッドは非常に低いです。

于 2012-05-08T14:49:15.330 に答える
0

OS タスク スケジューラは通常、プロセスに必要なすべての注意を払う必要がないため、多かれ少なかれランダムです。通常、非常に短い時間だけスリープすることはできません (たとえば、Thread.sleep(5)呼び出し後 5 ミリ秒以降にプロセスを再開する可能性があります) が、スリープ時間を長くすると、相対的な精度が向上します。

ある程度の余裕があれば、Thread.sleep(10000)通常は 10 秒近くの時間スリープします。

于 2012-05-08T14:43:43.910 に答える
0

多くのスレッドを実行していない限り、正確にかなり近いと思います。複数のスレッドがある場合、それは競争です。

于 2012-05-08T14:46:55.767 に答える