CodeGym /Java Blog /ランダム /JavaのThread.sleep()メソッド
John Squirrels
レベル 41
San Francisco

JavaのThread.sleep()メソッド

ランダム グループに公開済み
Java プログラムでは、スレッドの実行が速すぎる場合や、プログラムを別のスレッドに切り替える必要がある場合があります。これを行うには、現在のスレッドの実行を一時停止する必要があります。Java では、これはjava.lang.Thread.sleep()メソッドを使用して実行できます。

Thread.sleep() メソッド

Threadクラスは Java.lang パッケージに存在し、Thread.sleep ()メソッドが含まれています。 Java.lang.thread sleep()メソッドは、ミリ秒単位で指定された時間、現在のスレッドを一時停止するために使用されます。Oracle のドキュメントを見ると、 Threadクラスのオーバーロードされたsleep()メソッドが2 つあることがわかります。

static void sleep(long millis)
ここで、millis はミリ秒単位の時間です。このメソッドは、システム タイマーとスケジューラの精度に応じて、現在実行中のスレッドを数ミリ秒間スリープ (実行を一時的に停止、「スリープ」) させます。ミリ秒の引数値を負の値にすることはできません。その場合、IllegalArgumentExceptionがスローされます。

static void sleep(long millis, int nanos)
ここで、mils はミリ秒単位の時間を表し、nanos はナノ秒単位の時間を表します。このメソッドのバリアントは、現在のスレッドの実行をミリ秒およびナノ秒単位の正確な時間だけ一時停止するために使用されます。ナノ秒の値は 0 ~ 999999 の間で有効です。 Thread.sleep()メソッドを使用してメインスレッドの実行を 5 秒間一時停止する 簡単なプログラムを作成してみましょう。

public class SleepDemo {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
       }
}
このプログラムでは何が起こっているのでしょうか? 最初に起動し、次に 5 ミリ秒 (5 秒) スリープ状態になり、フリーズしていた期間に関するメッセージをコンソールに出力して終了します。出力は次のとおりです。
スレッドは 5008 ミリ秒間一時停止されます
ご覧のとおり、プログラムは 5 秒間一時停止せず、少し長く一時停止しました。また、コンピュータ上でプログラムを実行すると、スレッドの実行が 5000 ミリ秒を超えて停止する可能性があり、5008 ミリ秒は停止する必要がないことがわかります。重要なのは、すべてがオペレーティング システムとスレッド スケジューラの特定の実装に依存するということです。もう少し詳しく説明すると、スレッドがウェイクアップして実行を開始するまでに待機する実際の時間は、システム タイマーとスケジューラによって異なります。静かなシステムの場合、実際のスリープ時間は指定されたスリープ時間に近くなりますが、負荷の高いシステムの場合はわずかに長くなります。このメソッドは、常に何らかのアクションを実行する必要がある場合に、子スレッドでよく使用されますが、それほど頻繁ではありません。以下は、メッセージを毎秒出力し、決して終了しないプログラムの例です。

public class SleepDemo1 {

   public static void main(String[] args) throws InterruptedException {
       while (true)
       {
           Thread.sleep(1000);
           System.out.println("One more second");
       }
   }
}

Java Thread Sleepの注意点

Java Thread Sleepメソッドは次のように動作することに留意することが重要です。
  • 常に現在のスレッドの実行を一時停止します。

  • 実際のスレッドはウェイクアップするまでスリープし、実行時間はシステム タイマーとスケジューラによって異なります。

  • スリープ中のスレッドは現在のスレッドをブロックしません。

  • 他のスレッドは現在スリープ中のスレッドに割り込むことができ、その場合はInterruptedExceptionがスローされます。

  • ミリ秒の引数値は負の値にすることはできません。負の値を指定しないと、IllegalArgumentExceptionがスローされます。

IllegalArgumentExceptionをスローする例を示すには、上記のプログラムを少し変更するだけです。

public class SleepDemo1 {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(-5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
       }
}
出力は次のとおりです。
スレッド「メイン」java.lang.IllegalArgumentException での例外: SleepDemo.main(SleepDemo.java:7) の java.base/java.lang.Thread.sleep(Native Method) でのタイムアウト値が負です。
上記ではメインスレッドをスリープ状態にしました。次に、このメソッドを他のスレッドに適用してみましょう。

// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{

       public void run()
       {
           // thread 0
           try {
               for (int i = 0; i < 10; i++) {

                   // sleeps the main thread for about 2 seconds
                   Thread.sleep(2000);
                   System.out.println(i);
               }
           }
           catch (Exception e) {

               // catching the exception
               System.out.println(e);
           }
       }
       public static void main(String[] args)
       {
           SleepDemo2 sleepDemo2 = new SleepDemo2();
           sleepDemo2.start();
       }
}
出力は次のとおりです。
0 1 2 3 4 5 6 7 8 9
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION