Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > スレッド −3.スレッドの作成
更新日:2005/10/9
スレッド−3.スレッドの作成
このページではスレッドの作成方法において、Threadクラスを継承する方法とRunnableインタフェースを実装する方法のそれぞれについて説明します。また、両方法の使い分けについても説明します。
Threadクラスを継承してのスレッドの作成
はじめてのスレッドの例題でも取り上げましたが、スレッドを作成する1つの方法にThreadクラスを継承する方法があります。継承したサブクラスでThreadクラスのrunメソッドをオーバーライドします。
Threadクラスを継承してのスレッドの作成

【例1】名前とふりがなをスレッドで、それぞれ5回ずつ表示するプログラムです。
【showName.javaファイル】

//(1)Threadクラスを継承
class showName extends Thread {
  //(2)runメソッドをオーバーライド
  public void run() {
    for (int i = 1; i <= 5; i++) {
      System.out.println("名前:Java太郎");
      try {
        sleep(1000);
      } catch (InterruptedException e) {
      }
    }
  }
}

【showFurigana.javaファイル】

//(3)Threadクラスを継承
class showFurigana extends Thread {
  //(4)runメソッドをオーバーライド
  public void run() {
    for (int i = 1; i <= 5; i++) {
      System.out.println("ふりがな:javaたろう");
      try {
        sleep(1000);
      } catch (InterruptedException e) {
      }
    }
  }
}

【ExThread2.javaファイル】

class ExThread2 {
  public static void main(String[] args) {
    //(5)thread1オブジェクトの生成
    showName thread1 = new showName();
    //(6)thread2オブジェクトの生成
    showFurigana thread2 = new showFurigana();

    thread1.start();  //(7)スレッドを実行可能状態にする
    thread2.start();  //(8)スレッドを実行可能状態にする
  }
}

【解答1】

(1). スレッドを実装するクラスshowNameを定義し、Threadクラスを継承します。
(2). Threadクラスのrunメソッドをオーバーライドし、スレッド実行時に実行されるコードを定義します。ここでは「名前:Java太郎」を5回表示します。
(3). スレッドを実装するクラスshowFuriganaを定義し、Threadクラスを継承します。
(4). Threadクラスのrunメソッドをオーバーライドし、スレッド実行時に実行されるコードを定義します。ここでは「ふりがな:javaたろう」を5回表示します。
(5). showNameクラスのオブジェクトthread1を生成します。
(6). showFuriganaクラスのオブジェクトthread2を生成します。
(7). thread1オブジェクトのスレッドを実行可能状態にします。
(8). thread2オブジェクトのスレッドを実行可能状態にします。

【実行結果1】

D:\JAVA>javac ExThread2.java

D:\JAVA>java ExThread2
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう

D:\JAVA>
Runnableインタフェースを実装してのスレッドの作成
スレッドを作成するもう1つの方法として、Runnbaleインタフェースを実装する方法があります。Runnableインタフェースにはrunメソッドのみが定義されています。以下の手順により、スレッドの作成・実行を行います。
(1). スレッドを作成したいクラスでRunnableインタフェースを実装し、runメソッドの本体を定義します。
(2). スレッドを実行する場合はThreadクラスのオブジェクトを生成し、その際、コンストラクタの引数にRunnbaleインタフェースを実装したクラスのオブジェクト変数を指定します。
(3). Threadクラスのオブジェクトからstartメソッドを呼び出し、スレッドを実行します。
Runnableインタフェースを実装してのスレッドの作成

【例2】例1のThreadクラスのサブクラスを用いてスレッドの作成を行った例をRunnableインタフェースを実装してのスレッドの作成に変更した例です。
【showName.javaファイル】

//(1)Runnableインタフェースを実装
class showName implements Runnable {
  //(2)runメソッドの本体を定義
  public void run() {
    for (int i = 1; i <= 5; i++) {
      System.out.println("名前:Java太郎");
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
      }
    }
  }
}

【showFurigana.javaファイル】

//(3)Runnableインタフェースを実装
class showFurigana implements Runnable {
  //(4)runメソッドの本体を定義
  public void run() {
    for (int i = 1; i <= 5; i++) {
      System.out.println("ふりがな:javaたろう");
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
      }
    }
  }
}

【ExThread3.javaファイル】

class ExThread3 {
  public static void main(String[] args) {
    //(5)showNameクラスのオブジェクトを生成
    showName sn = new showName();
    //(6)showFuriganaクラスのオブジェクトを生成
    showFurigana sf = new showFurigana();

    //(7)Threadクラスのオブジェクトを生成
    Thread thread1 = new Thread(sn);
    //(8)Threadクラスのオブジェクトを生成
    Thread thread2 = new Thread(sf);

    thread1.start();  //(9)スレッドを実行可能状態にする
    thread2.start();  //(10)スレッドを実行可能状態にする
  }
}

【解答2】

(1). Runnableインタフェースを実装したクラスshowNameを定義します。
(2). runメソッドの本体を定義します。Threadクラスを継承していないため、sleepメソッドは完全修飾名で記載します。
(3). Runnableインタフェースを実装したクラスshowFuriganaを定義します。
(4). runメソッドの本体を定義します。Threadクラスを継承していないため、sleepメソッドは完全修飾名で記載します。
(5). showNameクラスのオブジェクトsnを生成します。
(6). showFuriganaクラスのオブジェクトsfを生成します。
(7). Threadクラスのオブジェクトthread1を生成し、その際のコンストラクタの引数にrunメソッドの本体を定義したクラスshowNameのオブジェクト変数snを指定します。
(8). Threadクラスのオブジェクトthread2を生成し、その際のコンストラクタの引数にrunメソッドの本体を定義したクラスshowFuriganaのオブジェクト変数sfを指定します。
(9). thread1オブジェクトのスレッドを実行可能状態にします。
(10). thread2オブジェクトのスレッドを実行可能状態にします。

【実行結果2】

D:\JAVA>javac ExThread3.java

D:\JAVA>java ExThread3

名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう
名前:Java太郎
ふりがな:javaたろう

D:\JAVA>
ThreadクラスとRunnableインタフェースの使い分け
スレッドを作成する方法としてどのような時にThreadクラスのサブクラスを使い、どのような時にRunnableインタフェースを使うのかと言ったことがあります。一般にスレッドを実装するクラスが別のクラス(Appletなど)のサブクラスでなければならない時にRunnableインタフェースを使用します。これはJavaではクラスの多重継承は認められていないためです。一方インタフェースは、一つのクラスに対して複数のインタフェースを実装することが可能です。
× クラスの多重継承が認められていないため、これはできない。
class ExThread4 extends Applet, Thread {
    --------------------------------------
    --------------------------------------

○ スレッドを実装したいクラスがThreadクラス以外のクラスを継
   承する必要がある場合は、Runnbleインタフェースを使用する。
   インタフェースは複数の実装が可能。
class ExThread4 extends Applet implements Runnable, Cloneable{
    --------------------------------------
    --------------------------------------



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道