[ Top ] > [ Communication ] > [ study ] > [ Java ]
>スレッド-1-
 
 
 

スレッド-1-

スレッドについて実験します。

> myThread.java
class myThread{

  //メイン処理
  public static void main(String args[]){
    childThr thr1 = new childThr("ひとつ目");
    childThr thr2 = new childThr("二つ目");
    
    thr1.start();
    thr2.start();
  }
}


class childThr extends Thread{

  String thMsg;

  public childThr(String s){
    this.thMsg = s;
  }
  //スレッド処理
  public void run(){
      System.out.println(this.thMsg);
  }
}

一つのファイルに二つのクラス(ここでは、メインになる myThreadクラス、Threadクラスを継承した childThrクラス)があります。

 

まず、myThreadクラスからみていきます。

childThr thr1 = new childThr("ひとつ目");
childThr thr2 = new childThr("二つ目");
メインの方で、childThrクラスを呼び出しインスタンス化しています。
コンストラクタ時に String型の値を必要とするので、各スレッドを区別するために別々の文字列をいれました。

thr1.start();
thr2.start();
インスタンス化させたあとは、childThrクラスが保持する runメソッド ではなく、runメソッドを呼び出したい場合は、 startメソッドを使用します。

 

次に、childThrクラスをみていきます。

String thMsg;
各スレッドが個別にもつ値を宣言しておきます。今後このプログラムを改良しますので、最初に宣言しておきます。

public childThr(String s){
  this.thMsg = s;
}
コンストラクタです。引数に String型の値を受け取れるようにしてあります。
ここで、 this.thMsg としているのは、各スレッドに別々の thMsg という値を保持するためです。
this は、『このインスタンス上の』 のような意味になります。
つまり、『このインスタンス上のみ有効な変数 thMsg に』という感じでしょうか。 メインの方でインスンタンス化させた thr1thr2 それぞれ別の thMsg をもつことになります。
ただし、 this は、省略してもかまわないようです。ただ、明示した方がわかりやすいので。
この辺は、FlashのActionScriptをやっていればわかると思いますが・・・。
これは、またあとで別の例で説明します。

public void run(){
  System.out.println(this.thMsg);
}
各スレッドが実行する作業を run メソッドで定義します。
ここでは、各スレッドがそれぞれ保持している this.thMsg を表示させているだけです。

結果

>java myThread
ひとつ目
二つ目
>

なんか、これだとわかりにくいですが、各スレッドがそれぞれ別の値を出力しました。
もっとわかりやすい例を、次で実験しました。