●スレッド-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{
    --------------------------------------
    --------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值