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(); } }