- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:wait中にinterruptを呼ばれたスレッドの振る舞いについて)
wait中にinterruptを呼ばれたスレッドの振る舞いについて
このQ&Aのポイント
- wait中のスレッドがinterruptを呼ばれると、Fooクラスのロックを取得してInterruptedExceptionをスローするかわからない。
- wait中であるスレッドが他のスレッドによってinterruptされた場合、fooメソッド内でFooクラスのロックを取得してからInterruptedExceptionをスローするかどうかについての疑問です。
- wait中のスレッドがinterrupt()を実行された時に、Fooクラスのロックを取得してからInterruptedExceptionをスローするのか、すぐにInterruptedExceptionをスローするのかが分かりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
当然 Foo のインスタンス (Foo クラスじゃないよ!) のロックを取得してから例外がスローされます。 そもそもロックの取得も例外のスローも wait() メソッドの中で行われることなのだから、catch の有無によって動作が変わることなどありえません。wait() メソッドの中から呼び出し元 (つまり foo() メソッド) のコードがどうなっているかなんて知る由もありませんからね。 念のため foo() メソッドの全体の動作を書いておきます。 foo() メソッドがどこからか呼ばれる。 ↓ Foo のインスタンスのロックを取得 ↓ wait() メソッドが呼ばれる ↓ (wait() メソッドの中で) Foo のインスタンスのロックを解除して、待機状態に入る ↓ その後ほかのスレッドから interrupt されると、 (wait() メソッドの中で) Foo のインスタンスのロックを再取得して、InterruptedException をスローする ↓ wait() メソッドから foo() メソッドに戻る ↓ 例外は foo() の中ではキャッチされない ↓ Foo のインスタンスのロックを解除して、foo() メソッドを抜ける ↓ InterruptedException は foo() の呼び出し元に伝播する
お礼
UKY様へ ご回答ありがとうございました。また、ご丁寧に foo() メソッドの全体の動作まで書いていただき ありがとうございました。とてもわかりやすかった です。勉強になりました。勉強不足を痛感しています。