感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Javaでマルチスレッド。スレッドの状態のまとめとjoin()メソッドを使ってみるサンプル。

スポンサーリンク

昨日の勉強の続き。
スレッドのライフサイクルについて。

Javaのスレッドには様々な状態がある。

一つ一つの状態を見てみよう。

  • 新規(New)

インスタンス化された直後の状態で、まだ開始されていない状態のこと。

  • 準備完了/実行可能(Ready/Runnable)

Threadオブジェクトのstart()メソッドが呼び出されたときの状態。
まずスレッドは「実行可能」状態になる。
で、スケジューラが実行可能なスレッドから実行するスレッドを選択する。

  • 実行(Running)

スレッドが実行中の状態。run()メソッドの中の処理が行われる。

  • 実行不可能(Nonrunnable)

実行中のスレッドが「実行の対象外」になった場合は、以下のような実行不可能な状態に移される。
・ブロック(Blocked)
スレッドがI/Oなどのリソース、オブジェクトのロックを取得するために待機するときに、この状態に移行する。
・休眠(Sleeping)
スレッドは指定した時間だけこの状態を維持する。sleep()メソッドでこの状態に移る
・待機(Waiting)
wait()メソッドを呼び出すと、この状態に移行する。
スレッドは待機状態に移行する。

  • 死亡(Dead)

run()メソッドの処理が完了したスレッドが死亡とみなされる。
死んだスレッドは二度と実行できない。

スレッドのメソッドたち

wait()はスレッドを待機状態にする。
notify()メソッドやnotifyAll()メソッドを呼び出すと、wait()されているスレッドに解除の通知がされる。
join()はスレッドの終了の待ち合わせを実現する。つまり、対象スレッドが終了するまで停止する。

Thread join()のサンプル

join()は「待ち合わせる」といってもわかりづらいと思うから、簡単なサンプルを見てみる。

package sample.thread;

public class MultiThreadExample implements Runnable {
	private String tName;
	private int sleepTime = 3000;
	public int getSleepTime() {
		return sleepTime;
	}
	public void setSleepTime(int sleepTime) {
		this.sleepTime = sleepTime;
	}
	public String gettName() {
		return tName;
	}
	public void settName(String tName) {
		this.tName = tName;
	}

	@Override
	public void run() {
		System.out.println("Sleep(休眠)します。私は" + tName);
		try {
			System.out.println("休眠中...");
			Thread.sleep(sleepTime);
			System.out.println("おはよう!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws Exception {
		MultiThreadExample ex1 = new MultiThreadExample();
		ex1.settName("tONE");
		ex1.setSleepTime(5000);
		MultiThreadExample ex2 = new MultiThreadExample();
		ex2.settName("tTWO");
		ex2.setSleepTime(2000);
		Thread t1 = new Thread(ex1);
		Thread t2 = new Thread(ex2);
		t1.start();
		System.out.println("これは普通に出力される");
		t1.join();
		System.out.println("これはt1のrun()が終わった後に実行される");
		t2.start();
	}
}

これを実行すると、、、
以下のように、ひとつめのスレッドが終わるのを待ち構えて、次のスレッドを実行することができる。(tONEが完了してからtTWOが実行されてる)

Sleep(休眠)します。私はtONE
休眠中...
これは普通に出力される
おはよう!
これはt1のrun()が終わった後に実行される
Sleep(休眠)します。私はtTWO
休眠中...
おはよう!

長くなったので、また続きは別の記事に。