スレッドを生成する


Javaでマルチスレッドのプログラムを作成する時は、Threadクラスを使うことで実現でき、プログラムパターンは大きく2つ考えられます。
1つは、Threadクラスを継承したクラスを作成し、その1つのクラスの中に、新しいスレッドを呼び出す機能と、
呼び出されて実行される機能の両方を記述します。
もう1つは、新しいスレッドを呼び出すクラスと、呼び出されて実行されるクラスの2つのクラスを作成するパターンです。
この場合、呼び出す側がThreadクラスを持ち、呼び出される側が、run()メソッド(Runnable インターフェースのメソッド)を実装します

下のサンプルプログラムは2つのクラスに分かれているパターンで、ExamThreadA1がFrameとButton(制御する側)、
ExamThreadA2がタイマー(制御される側)です。
STARTボタンをclickすると、タイマーがスタートし、STOPボタンを押すと、終了します。
1度終了した(run()メソッドを終了した)スレッドは、再開できません。

import  java.awt.*;
import  java.awt.event.*;
import  javax.swing.*;
import  java.util.*;

class  ExamThreadA1  extends  JFrame  implements  ActionListener{
    Thread    thr;
    JButton  jbstart,  jbend;
    ExamThreadA2  eta2;

    public static void main(String args[]) {
        ExamThreadA1  eta1  =  new  ExamThreadA1();
        eta1.addWindowListener(  new WindowAdapter()  {
              public  void  windowClosing(WindowEvent  we )  {
                  System.exit(0);
              }
        });
        eta1.setBounds(30,30, 400,100);
        eta1.setVisible(true);
    }
    ExamThreadA1()  {
        super("Thread Sample A");
        jbstart  =  new  JButton("START");
        jbstart.addActionListener( this);

        jbend    =  new  JButton("STOP");
        jbend.addActionListener(this);

        JPanel   jp       =  new  JPanel(new  GridLayout(2,1));
        jp.add(jbstart);
        jp.add(jbend);
        getContentPane().add(jp, BorderLayout.WEST);

        eta2  =  new  ExamThreadA2();   
        getContentPane().add(eta2, BorderLayout.CENTER);
 
        thr  =  new  Thread(eta2);
    }
    public  void  actionPerformed(ActionEvent  ae)  {
        if(ae.getSource()   ==  jbstart)  {
                thr.start();
        }  else if  (ae.getSource()   ==  jbend)   {
                eta2.end();                                        // Don't  use  stop() method
        }
    } 
}

class  ExamThreadA2  extends  JLabel implements  Runnable  {
    private  int  i;                                              

    public  void  run()  {
        while(i != 9)  {
            Date  date  =  new  Date();
            setText(date.toString());
        }
    }
    public  void  end()  {
           i  =  9;
    }
}



実行結果


プログラムを起動した状態の画面です。
STARTボタンをclickすると
タイマーが動き出し、
STOPボタンでタイマーが停止します。


Thread class constructor
Threadクラスをコンストラクタを使ってインスタンス化するときに、引数としてコントロールしたいオブジェクト(スレッド)への参照を渡し、
関連付けます。

start() method
run()メソッドを呼び出します。

run() method
Runnableインターフェースのメソッドです。
ここに実装された内容が、呼び出されたスレッドとして実行されます。
このメソッドを終了すると、スレッドも終了します。

stop() method
Threadクラスのstop()メソッドは、推奨されないメソッドに指定されているので、
sampleコードでは呼び出し元がstop()メソッドを操作する代りに、呼び出された側がrun()メソッドを終了するロジックを記述しました。
つまり、whileループを継続するか否かを制御する変数とその変数を操作するメソッドを用意し、呼び出し元からその変数を操作する事で、
スレッドを終了しています。

推奨されないメソッドである理由はhttp://java.sun.com/j2se/1.3/ja/docs/ja/api/index.html
を参照してください。