2017-02-10 15 views
0
public static void main(String[] args) { 
     String resource1 = "ratan jaiswal"; 
     Thread t1 = new Thread() { 
      public void run() { 
       synchronized (resource1) { 
        System.out.println("Thread 1: locked resource 1"); 
        try { 
         Thread.sleep(100); 
        } catch (Exception e) { 
        } 
        try { 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }; 

     Thread t2 = new Thread() { 
      public void run() { 
       synchronized (resource1) { 
        System.out.println("Thread 2: locked resource 2"); 
        try { 
         Thread.sleep(100); 
        } catch (Exception e) { 
        } 
       } 
      } 
     }; 

     t1.start(); 
     t2.start(); 
    } 

私はt1がリソース1のモニターを所有しているので、すべてがここでOKです見るように私はこの例外を取得するのはなぜ ライン16は、()同期ブロックでIllegalMonitorExceptionが発生するのはなぜですか?私はこのコードを実行した後

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Unknown Source) 
    at ThreadSyncFromMark.deadlock.dead$1.run(dead.java:16) 

を呼び出し待ちとラインで取得しますそれは私がt1が、それは呼んで待つリソース1のモニターを所有しているので、すべてがここでOKです見るように私はこの例外を取得するのはなぜ

+1

スレッドがオブジェクトのモニタで待機しようとしたこと、または指定されたmonitor_を所有していないオブジェクトのモニタで待機している他のスレッドに通知しようとしたことを示す、 – AxelH

答えて

4

待つ呼び出すとき

はい、t1resource1のモニターを所有しています。しかし、あなたはresource1.wait()に電話していないので、this.wait()と呼んでいます。

synchronizewait()、およびとは、すべて同じオブジェクト(モニタ)上にある必要があります。

関連する問題