スレッドのスリープ

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に空き時間が生じて、別のスレッドが実行されていることがわかります。

  1. まず、main() メソッドが開始して最初のメッセージを出力します。
  2. 続いて SleepingASleepingB をスレッドとして開始した後2秒間スリープします。
  3. この間に、最初に開始された SleepingA のスレッドが実行されて最初のメッセージを出力した後1秒間スリープします。
  4. この間に、次のスレッド SleepingB が実行されて0.5秒間のスリープ後復帰して最後のメッセージを出力して終了します。
  5. 次に、1秒間のスリープから復帰した SleepingA が最後のメッセージを出力して終了します。
  6. 2秒間のスリープから復帰した main が最後のメッセージを出力し、
  7. 全ての制御フローが終了します。


Copyright © 2002 SUGAI, Manabu. All Rights Reserved.