2017-06-25 4 views
1

ここでは、スレッド間の相互通信のtryブロックでwait()メソッドを使用しています。私はtryブロックの外でwaitメソッドを使用しましたが、例外を示していました。tryブロックの中でwait()メソッドを使用するのはなぜですか? tryブロックの外側にwait()メソッドを使用できますか?

try 
{ 
    System.out.println(" why we should use wait() method in try block "); 
    wait(); 
} 
    catch() 
    { 
    } 
} 
+4

[Object#wait'のJavaDocs](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait - )、それは 'RuntimeException'と' InterruptedException'の二つの例外をスローします。これはキャッチされた例外です。あなたが処理しなければならないので、 'no'で' wait'を呼び出さなければなりません。 try-catch'または例外を再スローする – MadProgrammer

+0

@MadProgrammerによると、InterruptedExceptionをキャッチするか、メソッドがthrowすると宣言する必要があります – okaram

+0

ありがとうございました。 –

答えて

3

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ブロックは必須ではありません。 (上記を参照してください)

+0

up !!!こんにちは、簡単な例を書く必要があるかもしれません。 e。g:同期されたメソッドは、 'wait'がスローされる例外をスローします。 –

関連する問題