スレッドを生成する
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
を参照してください。