スレッドを終了させる方法は、2つ。
- mainメソッドを終了させる(プログラムと同時に起動されたスレッドの場合)
- runメソッドを終了させる(プログラムの途中で起動されたスレッドの場合)
今の自分では、プログラムと同時にスレッドを起動させるというのがちょっとわからないのですが、全く別のプログラムを起動させるという意味と同じなんでしょうか?うーむ…。
スレッドを外部から終了させる場合は、以下のような流れです。
- runメソッドを実装したクラスで、スレッドの実行状態を表現するboolean型メンバ変数を持つ
- runメソッド内で、スレッドの実行状態を確認する仕組みを設け、実行状態が「終了」となっていたら、runメソッドが終わるようにしておく
- そのスレッドの実行状態を変更できるメソッドを準備する
- スレッドの実行状態を「実行中」にして新しいスレッドを起動させる
- 外部からスレッド状態を変更するためのメソッドを呼び出す
サンプルコードは以下の通り。
スレッドが1秒毎にカウンターをインクリメントして、10になったらスレッドの実行状態をfalseに変更してrunメソッドから抜けてスレッドを終了させます。
public class CounterUp implements Runnable {
    private boolean running = true; // 実行状態を表すメンバ変数
    private int i = 0;
    private String name;
    public CounterUp(String name) {
        this.name = name;
    }
    public void run() {
        while(running) {
            try {
                Tread.sleep(1000);
            } catch (InterruptedException e){}
            System.out.println(name + " : " + i);
            i++;
        }
    }
    public void stopRunning() {
        running = false;
    }
    public static void main(String[] args) {
        CounterUp cu = new CounterUp("thread 1");
        new Thread(cu).start(); // スレッド起動
        while(true) {
            if (cu.i == 10) {
                cu.stopRunning();
                System.out.println("stop!");
                break;
            }
        }
    }
}
以上です。

