2012-05-08 6 views
1

は、ここで私はちょうどスレッドがexaclty 10秒間スリープし、その後Afterを印刷するかどうかを知りたいか、そこにある私のコードんのThread.sleep()が実行が正確な間隔で中止する作る

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 
} 

ですいくつかの遅延?

+1

「正確に」の値では、「はい」です。それは確かに試行の間にナノ秒とミリ秒のレベルで逸脱することができます。 – pap

+0

あなたが正確に意味するものと遅れていくものに依存します。 10秒であるシリコンと比較すると、他の悪い行為をしたプロセスがCPUを嫌うのでなければ、ナノ秒のように思えるはずです。 –

答えて

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秒が経過した後にスケジューラが実行されないようにすると、より長い時間スリープすることがあります。
同時実行スレッドが同時に実行可能プールにある場合に発生する可能性があります。

0

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

余裕がある場合は、通常、Thread.sleep(10000)は10秒に近い時間スリープします。

2

少なくとも10秒間スリープ状態になり、(中断されない限り)少し後にスリープ状態になります。どのくらい後にOSとマシンの負荷に依存します。

+0

だから、10年後に 'After'が印刷されるという保証はありません。 –

+0

スケジューリング**の保証**には、リアルタイムOSが必要です。リアルタイムJavaもあります:http://en.wikipedia.org/wiki/Real_time_Java –

+0

+1のリンク: –

0

スレッドをたくさん実行していないと、かなり正確に近いと言えます。あなたはいくつかのスレッドを持っている場合、それは競争です。

0

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

3

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

実際にタイミングに依存する何らかのハードウェア通信を行っている場合は、おそらくRTSJを使用してください。

xミリ秒ごとに何か作業を行っている場合、若干良い結果を示すTimeTaskを使用できます。

+0

+1の情報:) –

関連する問題