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 も用意されています。