まめぞうの技術メモ

IT関連で勉強したことをメモします

【Java】無限ループのスレッドに割り込んで停止させる方法(interrupt)

Javaで無限ループのスレッドを終了させたい時、やり方を考えたので、この記事を書いてメモ&見た人への情報共有にしたいと思います。

Thread.interruptを使おう

  • Javaのスレッドには便利なメソッド「interrupt」がある
  • 「interrupt」メソッドを実行すると、「InterruptedException」を発生させることが出来る
  • スレッド側を「try - catch」で実装しておけば、catch側に処理を書くことで、無限ループを抜ける(=スレッド停止)が出来る

サンプルコード

  • このコードは、5秒おきにメッセージをプリント(何回目のプリントか)を出力するスレッドを実行します
  • スレッドは無限ループです
  • スレッド内で「InterruptedException」を受信したら、無限ループをbreakするように書いています
  • main関数側は、11秒待って(=2回メッセージを出力させて)から、「interrupt」を呼びます
public class ThreadInterrupt {
    public static void main(String[] args){
        // スレッドの生成&実行
        Thread1 th1 = new Thread1();
        Thread th = new Thread(th1);
        th.start();

        // 11秒待つ
        try{
            Thread.sleep(11000);
        }catch(Exception e){}

        // スレッドのスリープ中に
        // InterruptedExceptionを
        // 発生させる
        th.interrupt();
    }
}

/**
 * Threadクラス
 */
class Thread1 implements Runnable{
    @Override

    /**
     * 5秒に1度メッセージをプリントする無限ループ
     */
    public void run() {
        int cnt = 1;
        while(true){
            try{
                Thread.sleep(5000);
                System.out.println(cnt + " 回呼ばれました");
                cnt++;
            }catch(InterruptedException e){
                // InterruptedExceptionを受信したら無限ループを抜ける
                System.out.println("無限ループを抜けました");
                e.printStackTrace();
                break;
            }
        }
    }
}

実行結果

  • ちゃんと2回目のメッセージ出力のあと、無限ループを抜けられています。 Java無限ループ_Intteruptの結果