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 が最後のメッセージを出力し、