マイナー・マイナー

隠れた名作の発掘が生きがい。

Threadの生成方法と,無限にstartし続けない不思議


スポンサードリンク

Threadを2つの方法で実装してみる
JavaでのThread生成方法は大きく2つあります.


・方法1
Threadクラスを継承したクラスを作成し,それを利用する方法.


・方法2
Threadクラスのコンストラクタの引数にRunnableインタフェースを実装したクラスのオブジェクトを指定して利用する方法.


・方法1の実装例

public class ThreadTest extends Thread{

	public static void main(String[] args) {
		ThreadTest threadTest = new ThreadTest();
		threadTest.start();
	}

	public void run() {
		System.out.println("run");
	}
}


・方法2の実装例

public class ThreadTest implements Runnable{

	public static void main(String[] args) {
		Thread threadTest = new Thread(new ThreadTest());
		threadTest.start();
	}
	
	public void run() {
		System.out.println("run");
	}
}

上記のいずれの実行結果も,コンソールに"run"の文字が1度表示されます.


スレッドのstart()メソッドでスレッドを生成してみる

Threadクラスを継承する方法だと,start()メソッドをオーバーライドして実装することができます.なので,Runnableを実装したクラスでstart()を定義しておいて,それを方法2で実装した次のようなコードではメモリのオーバーフローが起きるまでスレッドが生成されるものだと思いました.


・実装例3

public class ThreadTest implements Runnable{

	public static void main(String[] args) {
		ThreadTest threadTest = new ThreadTest();
		threadTest.start();
	}

	public void start() { //(A)
		Thread thread = new Thread(this); //(B)
		thread.start(); //(C)
	}

	public void run() {
		System.out.println("run");
	}
}

けれど,実行結果は"run"という文字が一度表示されるだけでした.調べてみると,Runnableインタフェースを実装したThreadTestでstartメソッド(A)を定義しても,(B)のように定義して(C)で呼び出すというやり方では定義したstartメソッド(A)は呼び出されないそうです.おそらく,Threadのコードは次のようになっているのではないかと思います.


・Threadのソースコードのイメージ

class Thread {
	private Runnable thread;

	public Thread(Runnable thread) {
		this.thread = thread;
	}
	
	public void start() {
		thread.run();
	}
}