Revised: 27th/Jan./2003; Since: Mar./23rd/2002
現在実行中のスレッドを、指定されたミリ秒数の間、スリープ (一時的に実行を停止) させます。指定時間経過後に実行可能状態に移り、スレッドスケジューラの許可を得た後で実行を再開します。
public static void sleep(long millis) throws InterruptedException
このメソッドは static
宣言されたクラスメソッドですから、オブジェクト・メソッドとしてではなく、 Thread
クラスのメソッドとして呼び出します。この文を含んでいる制御のスレッドが、指定したミリ秒(1000分の1秒)の間停止したあとで実行可能状態に復帰します。但し、実行可能状態に遷移してからも、実行が再開されるためには、CPUに空き時間が生じて、スケジューラにディスパッチされる必要があるので、指定時間後、きっちりと実行が再開するわけではないことに注意してください。
Thread.sleep(1000); // 1秒停止後復帰
次のサンプルは、二つの実行可能クラスを定義しています。これらはスレッドとして実行されると、一つは1秒間停止し、一つは0.5秒間停止します。 main()
メソッドも一つのスレッドとして実行されますが、これは2秒間停止します。
SleepTest.java
:
class SleepingA implements Runnable { public void run() { System.out.println("SleepingA Start"); try { Thread.sleep(1000); // 1秒間停止 } catch (InterruptedException e) { System.out.println(e); } System.out.println("SleepingA End"); } } class SleepingB implements Runnable { public void run() { System.out.println("\t" + "SleepingB Start"); try { Thread.sleep(500); // 0.5秒間停止 } catch (InterruptedException e) { System.out.println(e); } System.out.println("\t" + "SleepingB End"); } } class SleepTest { public static void main(String[] args) throws InterruptedException { System.out.println("main Start"); // 実行可能クラスのインスタンス化 SleepingA runA = new SleepingA(); SleepingB runB = new SleepingB(); // スレッドへ委譲 Thread threA = new Thread(runA); Thread threB = new Thread(runB); // スレッドの開始 threA.start(); threB.start(); try { Thread.sleep(2000); // 2秒間停止 } catch (InterruptedException e) { System.out.println(e); } System.out.println("main End"); } }
SleepingA
はスレッドとして実行されると途中で1秒間停止します。 SleepingB
は途中で0.5秒間停止します。 main()
メソッドの制御は2秒間停止します。
それぞれのスレッドが制御の最初と最後にメッセージを出力していますが、 SleepingB
のメッセージは分かりやすくする為に、 \t
(円記号(又はバックスラッシュ)+t)でタブ文字を出力してメッセージにインデントをつけています。
実行例:
C:\Java\Thread>javac SleepTest.java C:\Java\Thread>java SleepTest main Start SleepingA Start SleepingB Start SleepingB End SleepingA End main End C:\Java\Thread>
出力例を見てみると、指定どおりスレッドが停止してCPUに空き時間が生じて、別のスレッドが実行されていることがわかります。
main()
メソッドが開始して最初のメッセージを出力します。SleepingA
と SleepingB
をスレッドとして開始した後2秒間スリープします。SleepingA
のスレッドが実行されて最初のメッセージを出力した後1秒間スリープします。SleepingB
が実行されて0.5秒間のスリープ後復帰して最後のメッセージを出力して終了します。SleepingA
が最後のメッセージを出力して終了します。main
が最後のメッセージを出力し、