【Java】メインスレッドから別スレッドの停止
自分用メモ。
メインスレッドからの停止
- Thread#interrupt()で行う。Thread#stop()メソッドは安全性を壊す可能性があり、非推奨
- Thread#interrupt()自体はインタラプト状態を変更するだけ。
- ただし、スレッドがThread#sleep(), Thread#wait(), Thread#join()を実行して止まっている間にThread#interrupt()を実行するとInterruptedExceptionを投げる。
- これはThread#sleep(), Thread#wait(), Thread#join()側がメソッドの中でスレッドのインタラプト状態を見て、明示的にInterruptedExceptionを投げているため
- Thread#sleep(), Thread#join()を読んだスレッドに対しては、Thread#interrupt()を実行する際にスレッドのロックを取る必要はなく、いつでも呼ぶことができる
- Thread#wait()を呼んだスレッドに対してThread#interrupt()を呼ぶとロックを再び取り直してからInterruptedExceptionを投げる
- Thread#isInterrupted()でインタラプト状態を取得できる
スレッド自身を止めるメソッド
メソッド | 説明 |
---|---|
sleep() | 指定された時間だけ実行を停止 |
wait() | スレッドがウェイトセットに入ってnotify/notifyAllされるのを待つ |
join() | 指定したスレッドが終了するのを待つ |
コード
public class Sample { private Thread thread = null; public void startThread() { thread = new Thread() { @Override public void run() { while(!isInterrupted()) { // 処理 } } }; thread.start(); } public void stopThread() { if (thread == null) { return; } thread.interrupt(); } }