Thread とは、独立して動作する program の一部分という程度の意味です。 Thread 化された program は、program の他の部分と関係なく勝手に動いてく れなければいけません。 たとえば、以下の program は thread を使った例です。
threadを使うには,最初の
public class なんたら extends java.applet.Appletの次に
implements Runnable
が必要です。
Runnable とは,他と独立に run する(走る)ような部分を持つということです。
threadは変数に入れて使います。そのために, Thread 型の変数をあらかじめ作っておきます。 その変数には,適当な名前を付けておきます。
threadは一つのprogram内でいくつ作ってもかまいません。 threadが複数ある場合には,
Thread thread1, thread2;
のように,複数の変数を作る必要があります。
ここで作った Thread 型の変数は, 作られた当初は null という特別な値を持ちます。
Browserは,このappletを読み込むと, まずこの中の init() を実行し, 次に start() を実行します。 そして,この page を見終わって次の page に移るときは, applet の stop() を実行します。
そこで,start() ではthreadの実行を開始し, stop() ではthreadの実行を止めるのが普通です。
そこで,start() methodには次のようなことを書いておきます。
public void start() {
if (thread1 == null) {
thread1 = new Thread(this);
thread1.start();
}
}
これは,まだ thread1 が null(作られていない)なら,
thread1 に新しい thread を代入するという意味です。
新しい thread を作るには、
new Thread(this)
とします。
stop() では,これと逆に,
public void stop() {
if (thread1 != null) {
thread1.stop();
thread1 = null;
}
}
のようにします。つまり,念のため thread1 にthreadが代入されて
いるかどうかチェックし,もし代入されている(null でない)なら,
そのthreadを止め,
止まっていることがわかるように変数には null を代入します。
threadの実際に動く部分は, 必ず run() というmethod名にしておきます。 たとえば以下のようにです。
public void run() {
while (true) {
try {
Thread.sleep(100); // sleep 100msec
} catch (InterruptedException e) {
break;
}
.......
何らかの処理
.......
repaint();
}
}
}
この while (true) { ... } は無限ループです。 ただし,ループを回りっぱなしだと CPU が他の仕事をするのに支障が出る 場合があるので,毎回 Thread.sleep(100) を実行して, 100ミリ秒だけ休ませています。この間に CPU は他の仕事ができるわけです。
Thread.sleep() を実行している間に,他から割り込みがかかる ことがあります。その場合の処理を決めているのが
try {
Thread.sleep(100); // sleep 100msec
} catch (InterruptedException e) {
break;
}
という構文です。これは,
Thread.sleep() を実行している間に割り込み(interrupt)がかかれば,
break を実行する(つまり無限ループを脱出する)という意味です。
なお、thread を一時的に停止する suspend(), 停止した thread を再開させ
るための suspend() という method も用意されています。