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回目のメッセージ出力のあと、無限ループを抜けられています。