phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

【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();
     }
}