Thread と Runnable の関係

アプレットの中に Threadの機構を実現する方法を説明します。


今までのイベント処理などは、全て Appletクラスにあらかじめ用意されていた 機能を利用して実現しました。 ところが、 Appletクラス自体には Thread を取り扱う機能は用意されていません!
では、どうしたら Threadを使ったアプレットを設計できるのでしょうか? こういう場合 Java言語では、 クラスを作る時に特別な機構を追加する新しい命令 implements を用います。 プログラムの実例で見てみましょう。


class SlideImage extends Applet implements Runnable {

      Thread slideThread=null;    // 画像の移動を行うスレッド
                    :
                    :

implementsによって追加されるもの(ここでは Runnable という名前) は、クラスではありません。 しかし、「あらかじめ用意されているクラスに似たデータ」と考えてください。

もう少し詳しく見てみましょう。 Runnableの内部には、データとして run()という名前の特別な関数 が用意されています。 この関数は Thread が実行する処理の内容になります。
Runnableによって追加されるのは、 Threadのデータではありません。 ですから、新しいアプレットの中で Threadクラスのデータを 新しく用意します。

Threadクラスのデータを生成する場合、 通常は run()関数を内部に implementされた オブジェクトを引数として指定します。


       slideThread = new Thread(this);

new Thread() はあるクラスの新しいデータを生成する時に用いる Java言語での普通の書き方です。 引数に与えてるthisは重要なキーワードで、 「今作っているクラスのデータそのもの」を指します。 これによって、生成されたThreadは、このアプレットの内部で 再定義される関数 run()の中身の処理をコントロールすることになります。

Threadをコントロールする具体的な関数もまとめておきましょう。

これらの関数は、run(), start(), stop()あるいはイベント処理の 関数の中から呼び出してください。 また、Threadを完全に止めたい時は、値に nullを 代入します。

「並列処理」と聞くと、当然何個もThreadを作りそうな気がします。 実際、そういう複雑なアプレットを設計することも可能です。 しかし、たいていの場合は、 「1つのアプレットに1つの Thread 」のパターンになります。 個々のアプレットが1つしかThreadの処理を持たなくても、 HotJavaが画面に表示するページ全体では 複数のThreadによって並列処理が行われることになります。 また、1つのアプレットの中でも run()内の処理と、 イベント処理とが並列処理されている点も忘れてはいけません。