Q:なぜ私たちは、tryブロック内で待機()メソッドを使用する必要がありますか?
あなたはブロックまたはメソッド内wait()
を使用しています。
synchronized (this) {
while (!this.isTeapot) {
this.wait();
}
System.out.println("I am a teapot");
}
、別の方法で...
synchronized (this) {
this.isTeapot = true;
this.notify();
}
なぜ?
- 仕様にはそう言われています。
- そうでない場合は
IllegalMonitorStateException
と表示されます。
なぜですか?
- この制限なしで、待機/通知条件変数を安全に実装することはできないためです。この要件はスレッドの安全性にとって不可欠です。競合状態および記憶異常を回避することができる。
try
ブロックは必須ではありません。そのレベルで例外を処理する必要がある場合は、try
ブロックを使用してください。そうでない場合は、伝播させます。これにはInterruptedException
が含まれますが、チェックされた例外であるため、ローカルにキャッチしなかった場合は、メソッドのthrows
節で宣言する必要があります。しかしこれは通常のJava例外処理です。特にない。例えば
:
try {
synchronized (this) {
while (!this.isTeapot) {
this.wait();
}
System.out.println("I am a teapot");
}
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
(上記の例の説明については、Why would you catch InterruptedException to call Thread.currentThread.interrupt()?を参照してください。)
Q:我々は、tryブロックの外に待機()メソッドを使用することはできますか?
あなたはブロックのwait()
外またはメソッドを呼び出すことはできません。 (上記参照)
try
ブロックは必須ではありません。 (上記を参照してください)
[Object#wait'のJavaDocs](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait - )、それは 'RuntimeException'と' InterruptedException'の二つの例外をスローします。これはキャッチされた例外です。あなたが処理しなければならないので、 'no'で' wait'を呼び出さなければなりません。 try-catch'または例外を再スローする – MadProgrammer
@MadProgrammerによると、InterruptedExceptionをキャッチするか、メソッドがthrowすると宣言する必要があります – okaram
ありがとうございました。 –