2011年9月14日水曜日

Javaのthreadの呼び出し方1

Javaのスレッドの基本的な呼び出し方法についてのまとめ。スレッドというのは複数の動作を平行して行うようにするための仕組みである。呼び出し方は大きく2種類ある。

  1. Threadクラスの拡張
  2. Runnableインタフェースの実装

スレッドというのは、特に指定がないと実行されるタイミングを制御することはできない(synchronizedなどを付けない限り)。例えば、Threadクラスを拡張して作成した次のスレッドを含むプログラムを実行すると、mainと書かれた行とrunと書かれた行はランダムに現れることが確認できる。runとmainが交互に現れることや、runが先に10行現れてmainが10行現れるといったことには必ずしもならない。

class countTen1 extends Thread{
 public static void main(String[] args){
  countTen1 ct = new countTen1(); // スレッドを実行するインスタンスを作成
  ct.start(); // スレッドの実行開始
  for( int i=0 ; i<10 ; i++ ){
   System.out.println("main i = " + i);
  }
 }
 public void run(){
  for( int i=0 ; i<10 ; i++ ){
   System.out.println("run i = " + i);
  }
 }
}

参考までに、手持ちの環境で実行した結果の例は次の通り。最後にmainとrunが連続で発生しており、規則性がないということが分かる。

d:\java>java countTen1
java countTen1
main i = 0
run i = 0
main i = 1
run i = 1
main i = 2
run i = 2
main i = 3
run i = 3
main i = 4
run i = 4
main i = 5
run i = 5
main i = 6
run i = 6
main i = 7
run i = 7
main i = 8
main i = 9
run i = 8
run i = 9

スレッドの実行はスレッドクラスのインスタンスが持つstartメソッドで開始する。また、スレッドの実行内容はrunメソッドに記述する。このとき、呼び出し方は必ずpublic void run()になる。

次にRunnableインタフェースを実装するスレッドの作成方法を示す。上のスレッドを拡張した場合と同じように動作するプログラムである。

class countTen2 implements Runnable{
 public static void main(String[] args){
  countTen2 ct = new countTen2();
  // スレッドインスタンスの生成時にRunnableを実装したインスタンスを渡す
  Thread t = new Thread(ct);
  t.start(); // スレッドの実行開始
  for( int i=0 ; i<10 ; i++ ){
   System.out.println("main i = " + i);
  }
 }
 public void run(){
  for( int i=0 ; i<10 ; i++ ){
   System.out.println("run i = " + i);
  }
 }
}

特徴は、Runnableインタフェースを実装したクラスはスレッドクラスではないので、スレッドクラスのインスタンスを作成するときに引数にクラスを入れてしまうということである。

2種類のスレッドの呼び出し方の使い分け方は、クラスの拡張を繰り返して作成された下の階層に属するようなクラスはRunnableを利用し、手軽にスレッドを利用したいのであれば、Threadを拡張して利用するということになる。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計