interruptメソッド点滴記録

1215 ワード

1、sleep方法とinterrupt方法
スレッドAが次のようにすると、スレッドを用いたsleep()メソッドが一時停止する.
Thread.sleep(10000);
このときスレッドBは、次の文を実行し、待機操作を放棄するように要求する.
a.interrupt(); //a   A   

ここで用いるinterruptメソッドは、Threadクラスのインスタンスメソッドである.interruptメソッドを実行する場合、Threadインスタンスのロックを取得する必要はない.任意のスレッドは、いつでも他のスレッドinterruptメソッドを呼び出すことができる.
sleepのスレッドがinterruptメソッドを呼び出すと、一時停止の状態は放棄される.InterruptedExceptionを放出します異常を投げ出すのは、Aスレッドです.
2、wait方法とinterrupt方法
スレッドAがwait方式で待機場合、sleepと同様にキャンセルすることができる.interruptメソッドを用いる、wait中のスレッドに対して「notifyを待たずに待機領域から出る」という意図を伝えることができる.
スレッドBが次の文を実行すると、sleep時と同様に、スレッドAはInterruptedException異常を放出する.
  
a.interrupt();

スレッドwaitの場合、ロックの問題に注意してください.スレッドは待機領域に入るとロックが解除され、waitのスレッドに対してinterruptが呼び出されるとロックが再取得する異常が放出される.ロックを取得するまで、異常を投げ出すことはできない.
3、Join方法とinterrupt方法
スレッドがjoinメソッドで他のスレッドの終了を待つ場合、interruptメソッドを使用してキャンセルすることができる.joinメソッドを呼び出すにはロックを取得する必要がないため、sleep時と同様にcatchブロックにすぐにジャンプする.
4、interruptメソッドは割り込み状態を変えるだけ
スレッドAはsleep,wait,joinを実行するとき、スレッドBはAのinterruptメソッドを呼び出し、確かにこのときAはInterruptedException異常が投げ出す.しかし、これは実はsleep、wait、joinなどの方法の内部で中断状態の値を絶えずチェックし、自分で投げたInterruptedExceptionです.