目次へ

2.2. Runnableインタフェースを実装する方法

Runnableインタフェースを実装したクラスを利用して新しいスレッドを実行するには、次の手順に従います。

  1. Runnableインタフェースを実装したクラスを作成する。
  2. そのクラスでrunメソッドを実装する。
  3. そのクラスのインスタンスを作成する。
  4. そのインスタンスを引数としたコンストラクタでThreadクラスのインスタンスを作成する。
  5. そのThreadクラスのインスタンスのstartメソッドを呼び出す。

Threadクラスを継承する方法に比べて少しだけ手順が増えています。先ほどのカウントダウンプログラムをこちらの方法で書き換えてみましょう。

リスト CountDownTest.java
  public class CountDownTest implements Runnable {
  
    private String name;
  
    public CountDownTest(String name) {
      this.name = name;
    }
  
    public void run() {
     for (int i = 3; i >= 0 ; i--) {
       try {
         Thread.sleep(1000);
       } catch (InterruptedException e) {}
       System.out.println(name + " : " + i);
     }
   }
 
   public static void main(String[] args) {
     CountDownTest cdt1 = new CountDownTest("thread 1");
     CountDownTest cdt2 = new CountDownTest("thread 2");
     Thread t1 = new Thread(cdt1);
     Thread t2 = new Thread(cdt2);
     t1.start();
     t2.start();
   }
 
 }

Runnableインタフェースを実装するクラスで定義しなければいけないメソッドはrunメソッドだけです。runメソッドには、Threadクラスを継承する場合と同じく、新しいスレッドで実行したい処理を記述します。このプログラムのrunメソッドは、Threadクラスを継承した場合とほぼ同じですが、sleepメソッドがThreadクラスのメソッドであるため、その参照方法だけ変わっています。

Runnableインタフェースを実装したクラスを新しいスレッドで実行するには、Runnableインタフェースを実装したクラスのインスタンス生成に加えて、Threadクラスのインスタンスも作成しなければいけません。Threadクラスのインスタンスを作成するときに、コンストラクタの引数としてRunnableインタフェースを実装したクラスのインスタンスを指定します。スレッドの起動は、先ほどと同じようにThreadクラスのstartメソッドによって実現されます。スレッドの起動部分のプログラムを1つのスレッドのみに着目すれば、次のようになります。

     CountDownTest cdt1 = new CountDownTest("thread 1");
     Thread t1 = new Thread(cdt1);
     t1.start();

このプログラムの実行結果は、Threadクラスを継承した場合と同じようになります。

2.3. 2つのスレッド作成方法の比較

これらの2つのスレッド作成方法はどのように使い分ければよいのでしょうか。

Threadクラスを継承する方法のほうが、実現するのは簡単です。しかしrunメソッドをオーバーライドするだけの簡単なスレッドなら、Runnableインタフェースを利用するようにして下さい。Threadクラスを継承する方法は、run以外のメソッドもオーバーライドしてスレッドの基本的な動作を変えたい場合にのみ使用する事が推奨されています。

(実習課題2)

実習課題1のプログラムを改良しなさい。

  • 「Thread」クラスを拡張している部分を、「Runnable」インタフェースを実装するように変える事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp