2014-01-15 3 views
7

Javaがこのコードでsubjectから例外をスローする理由を理解できません。誰かが私にそれを説明できますか?静的な方法でsynchronizedブロックでwait()を呼び出すと、Javaはjava.lang.IllegalMonitorStateExceptionをスローします。

class Wait implements Runnable 
{ 
    public void run() { 
     synchronized (Object.class) { 
      try { 
       while(true) { 
        System.out.println("Before wait()"); 
        wait(); 
        System.out.println("After wait()"); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public class ObjectMethodInConcurency 
{ 
    public static void main(String[] args) { 
     Wait w = new Wait(); 
     (new Thread(w)).start(); 
    } 
} 
+3

'待機()'のJavadocを読んで呼び出しているので、

synchronized(monitor){ monitor.wait(); } 

だからあなたたとえば、あなたは"Object.class.wait()"を使用するか、またはthisにモニタを変更します。 –

+3

@nos '現在のスレッドはこのオブジェクトのモニタを所有していなければなりません。'と '例外:IllegalMonitorStateException - 現在のスレッドがオブジェクトのモニタの所有者でない場合.' –

+2

あなたは、オンに同期。あなたは 'this.wait()'を呼び出すので、 'synchronized(Object.class)'の代わりに 'synchronized(this)'を実行する必要があります。 Object.classはオブジェクトではなく、Javaランタイムによって作成されたjava.lang.Classオブジェクトです。 – VGR

答えて

15

使用(本){代わりには、上記のコードでIllegalMonitorException後ろクラス

EDIT

推論

に(Object.classを)
を同期同期

同期キーワードを使用するJavaの場合対応するコードブロックを実行するためにロックとして使用されるモニターオブジェクトを作成して取得する方法です。

上記のコードでは、モニターは「Object.class」です。

wait()メソッドは、現在のスレッドに通知されるまで待機し、ロックを所有するモニタオブジェクトに対してwait()を呼び出さなければならないことを通知します。

したがって、wait()メソッドを呼び出す方法は以下のようになります。そうしないと、IllegalMonitorExceptionが発生します。あなたが現在のインスタンス上wait()方法

+0

メソッド呼び出しが 'this'です。 wait、notifyなどのメソッドは、同期オブジェクトに対して呼び出される必要があります。 – koralgooll

+1

@Gray - なぜIllegalMonitorExceptionを与えるのかについての理解を追加しました – Nu2Overflow

+1

あなたは確かにそうしました。素晴らしく見える。 +1常にあなたが後世の人にもお答えしています。 – Gray

関連する問題