動くプログラム

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

仕事の分担

初めに、しなければならない仕事の分担をはっきりさせましょう。

フレームを表示
Frameクラスを継承したクラスのコンストラクタで行う
青い円を表示
paintメソッドで行う
500m秒毎に青い円の位置を変える
新しいスレッドで行う

paintメソッドは再描画が要求されると、其の時の座標値で青い円を書きます。
500m経ったかどうかを判断し、経った場合には座標値を変更する、と言う仕事は別のスレッドでやって貰う様に分担する事にしましょう。

新しいスレッドの作成と動作

新しいスレッドは、Threadクラスのオブジェクトをインスタンス化する事で作成します。
Threadクラスのstartメソッドにより、runメソッドが呼び出されます。
runメソッドは、Runnableインターフェースのメソッドをオーバーライドする物です。
従って、runメソッドを記述するクラスには、Runnableインターフェースをimplementsする必要が有ります。
Threadクラスのオブジェクトをインスタンス化する時、コンストラクタの引数には、runメソッドが書かれているクラスのオブジェクトを指定します。

public class クラス名 extends Frame implements Runnable{
        グローバル変数の宣言
                Thread オブジェクト名;

        コンストラクタ{
                オブジェクト名 = new Thread(this);
                オブジェクト名.start();
        }
        public void run(){
                仕事の内容
        }
}

時間待ちの間は「お休みなさい」

時間待ちの間はCPUを解放し、他のイベントを受け付けられる様にしておく必要が有ります。
Threadクラスには、指定の時間に休んでいるメソッドが用意されています。
此のメソッドはstaticの付いたクラスメソッドです。

Thread.sleep(ミリ秒);

例外発生時の処理

通常、スレッドがスリープ中であれば、指定時間が経過する迄何も起きないはずです。
しかし、通常と別の処理が発生した場合には、起きて貰わなければなりません。
此を例外処理と言います。
sleepメソッド実行中に発生する例外は、InterruptedExceptionクラスのオブジェクトで処理されるので、以下の様に書きます。

try{
        Thread.sleep(500); //500ms寝てる
}
catch(InterruptedException e){
}

Threadクラスを継承した内部クラス

ThreadクラスはRunnableインターフェースを含んでおり、Threadクラスを継承したクラスには、Runnableインターフェースをimplementsせずにrunメソッドを書けます。
新しいクラスは、内部クラスにする事にしましょう。
此をインスタンス化した物が、新しいスレッドになります。

public class クラス名 extends Frame{
        グローバル変数の宣言
                内部クラス名 オブジェクト名; //スレッドの宣言

        コンストラクタ
                オブジェクト名 = new 内部クラス名(実引数); //スレッドのインスタンス化
                オブジェクト名.start(); //スレッドのスタート

        class 内部クラス名 extends Thread{
                public void run(){

        }
}

同じ内容のクラスを統合するには?

ThreadFrameA.javaでは作成した2つの内部クラスが、休み時間や1回の移動距離が異なるだけで、同じ内容のクラスでした。
2つのクラス間で異なる情報を、フィールドに持つ事により、2つのクラスを統合出来ます。
此処で、paintメソッドで表示する時、描くThreadオブジェクトが持っている位置情報が必要になります。
其処で、Threadクラスには、位置情報を設定したり、読み出したりするセッタ・ゲッタメソッドを設けます。

ソース ダウンロード
ThreadFrame.java Thread01.zip
ThreadFrameA.java
ThreadFrameB.java

戻る