Threadクラス

Threadクラスの取り扱いとそのメソッドについて解説します。


「スレッド」という用語は Java言語だけのものではありません。 最近の OS の基本概念の1つです。 簡単に説明すると、1つのプログラムをさらに細かい仕事の単位に分けたものです。 複数のスレッドによって処理の並列化を上手に実現すると、 プログラムの実行効率を上げることが可能になります。 たとえば、 ネットワークを通じて画像データを読んでいる間に他の処理を進めたり、 ユーザーの入力を待つ間に、他の処理を行うなどの工夫が考えられます。 スレッドの導入は、 プログラムを設計する上でも大きな手助けになります。 とりわけマルチメディアを扱うアプリケーションの場合、 単独のプログラムで複数の入出力を同時に処理しなくてはいけません。 バックグラウンドで音声データを再生しながら、同時にアニメーションの 処理などを実行するなどの例が考えられます。 開発言語がスレッドへのインターフェイスをサポートしてくれれば、 こうしたのプログラムを自然な形で実現することができるでしょう。
Java言語には Thread(スレッド)と呼ばれるクラスが用意されています。 このクラスがシステムとのインターフェイスを提供し、 スレッドのコントロールを実現します。

Runnableインターフェイスをインプリメントしたアプレットの中では Threadのオブジェクトを最低1つ新しく用意します。


public class Clock extends Applet implements Runnable {
 
       public Thread clock = null;  // スレッドの宣言
                      :

Threadクラスのオブジェクトをコンストラクタによって生成する場合、 引数として run() メソッドを内部にインプリメントされた オブジェクト(すなわちアプレット自身)を与える必要があります。 この仕事はアプレットの start() メソッド か mouseDonw() メソッドの中で行うのが適当でしょう。


       clock = new Thread( this );

これでスレッドと、 アプレットで定義された run()メソッドの処理とが結びつけられたことになります。 これ以降のスレッドの処理のコントロールは、 すべて Threadクラスのオブジェクト(上の例では clock )を 通じて行われます。

スレッドをコントロールするためのThreadのメソッドには、 次のようなものがあります。

Threadの主なメソッド
メソッド名 機能
start() スレッドの処理を開始させる
stop() スレッドの処理を停止させる
isAlive() スレッドが活動中か判定する
sleep() 現在のスレッドの処理を一時的に停止させる
引数は休憩する時間(ミリ秒単位)

これらのメソッドの使用法は、半ばパターン化されています。 Threadクラスの start()は、アプレットの start() メソッドか マウスのイベント処理のメソッドの中で呼び出します。 アプレットの start() メソッドから呼び出せば、 ページに登場した時からスレッドの処理が始まります。 たとえばアニメーションを最初から動かしたり、 上のサンプルの時計のような場合は、このパターンになります。 もし時計ではなく「ストップ・ウォッチ」であれば、 mouseDown() のような イベント処理のメソッドの中でスレッドを起動した方がいいでしょう。 Threadクラスの stop() も同様で、 アプレットの stop()メソッドか マウスのイベント処理のメソッドの中から呼び出します。
sleep()メソッドは他のメソッドと少し取り扱い方が違うので注意してください。 このメソッドは staticなメソッドです。したがって次のように Threadというクラス名で呼び出すことができます。 (オブジェクトの変数名を指定しても結果は同じです。) また、必ず割り込み処理が起きた時のための例外処理の形式を整えなければ なりません。


try {
     Thread.sleep( 1000 );  // 1秒間の一時停止 
}
catch( InterruptedException e ) {
    /* 例外発生時の処理の記述 */
}

Threadクラスの sleep() メソッドは、 「現在、仮想マシンのCUPで処理中のスレッドの処理を停止する」という意味です。 今のケースでは run()メソッドの中で呼び出してください。 なぜなら、スレッドのオブジェクトが処理しているのは run()メソッドの処理だけ で、他のメソッドはアプレット自身をコントロールしている 別のスレッドで処理されているからです。 それらを停止させても意味がありません。
Thread のオブジェクトを完全に消滅させたい時は、 他のクラスのオブジェクト同様、値に null を代入します。