Javaに関する様々な情報をご紹介します。

3スレッドの作成

Javaに関する様々な情報をご紹介します。

スレッドの作成

このページではスレッドの作成方法において、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. (1)スレッドを実装するクラスshowNameを定義し、Threadクラスを継承します。
  2. (2)Threadクラスのrunメソッドをオーバーライドし、スレッド実行時に実行されるコードを定義します。ここでは「名前:Java太郎」を5回表示します。
  3. (3)スレッドを実装するクラスshowFuriganaを定義し、Threadクラスを継承します。
  4. (4)Threadクラスのrunメソッドをオーバーライドし、スレッド実行時に実行されるコードを定義します。ここでは「ふりがな:javaたろう」を5回表示します。
  5. (5)showNameクラスのオブジェクトthread1を生成します。
  6. (6)showFuriganaクラスのオブジェクトthread2を生成します。
  7. (7)thread1オブジェクトのスレッドを実行可能状態にします。
  8. (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. (1)Runnableインタフェースを実装したクラスshowNameを定義します。
  2. (2)runメソッドの本体を定義します。Threadクラスを継承していないため、sleepメソッドは完全修飾名で記載します。
  3. (3)Runnableインタフェースを実装したクラスshowFuriganaを定義します。
  4. (4)runメソッドの本体を定義します。Threadクラスを継承していないため、sleepメソッドは完全修飾名で記載します。
  5. (5)showNameクラスのオブジェクトsnを生成します。
  6. (6)showFuriganaクラスのオブジェクトsfを生成します。
  7. (7)Threadクラスのオブジェクトthread1を生成し、その際のコンストラクタの引数にrunメソッドの本体を定義したクラスshowNameのオブジェクト変数snを指定します。
  8. (8)Threadクラスのオブジェクトthread2を生成し、その際のコンストラクタの引数にrunメソッドの本体を定義したクラスshowFuriganaのオブジェクト変数sfを指定します。
  9. (9)thread1オブジェクトのスレッドを実行可能状態にします。
  10. (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{
--------------------------------------
--------------------------------------

3スレッドの作成