みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

wait中にinterruptを呼ばれたスレッドの振る舞いについて

はじめまして。javaの初心者です。
どうしてもわからないことがあります。
例えば、以下のコードで、
class Foo
{
public synchronized void foo()
{
while(条件)
{
try
{
this.wait();
}
catch(InterruptedException ex)
   {
    処理
   }
}
}
}
wait中であったスレッドは、他のスレッドによって
interrupt()メソッドを実行されたときは、Fooの
ロックを取得してからcatch節を実行すると思うのですが、もし、以下のコードの場合は、
class Foo
{
public synchronized void foo()
throws InterruptedException
{
while(条件)
{
this.wait();
}
}
}
wait中であったスレッドは、他のスレッドによって
interrupt()を実行されたときにすぐにInterrupted
Exceptionをスローするのか、それとも
Fooクラスのロックを取得してからInterruptedExceptionをスローするのかどちらなのか
がわかりません。どうか教えてください。よろしく
お願いします。

投稿日時 - 2006-08-08 18:34:42

QNo.2327637

すぐに回答ほしいです

質問者が選んだベストアンサー

当然 Foo のインスタンス (Foo クラスじゃないよ!) のロックを取得してから例外がスローされます。
そもそもロックの取得も例外のスローも wait() メソッドの中で行われることなのだから、catch の有無によって動作が変わることなどありえません。wait() メソッドの中から呼び出し元 (つまり foo() メソッド) のコードがどうなっているかなんて知る由もありませんからね。

念のため foo() メソッドの全体の動作を書いておきます。
foo() メソッドがどこからか呼ばれる。

Foo のインスタンスのロックを取得

wait() メソッドが呼ばれる

(wait() メソッドの中で) Foo のインスタンスのロックを解除して、待機状態に入る

その後ほかのスレッドから interrupt されると、
(wait() メソッドの中で) Foo のインスタンスのロックを再取得して、InterruptedException をスローする

wait() メソッドから foo() メソッドに戻る

例外は foo() の中ではキャッチされない

Foo のインスタンスのロックを解除して、foo() メソッドを抜ける

InterruptedException は foo() の呼び出し元に伝播する

投稿日時 - 2006-08-09 14:51:14

お礼

UKY様へ

ご回答ありがとうございました。また、ご丁寧に
foo() メソッドの全体の動作まで書いていただき
ありがとうございました。とてもわかりやすかった
です。勉強になりました。勉強不足を痛感しています。

投稿日時 - 2006-08-09 15:31:42

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問