2014-03-31 149 views
0

我有以下的Java代碼:爲什麼我收到`IllegalMonitorStateException`例外

public class Lean extends Thread 
{ 
    public static void main(String args[]) throws InterruptedException 
    { 
     Lean lean = new Lean(); 
     System.out.println("starting"); 
     lean.start(); 
     lean.join(); 
     System.out.println("end"); 

    } 

    public void run() 
    { 
     try 
     { 
      System.out.println("waiting"); 
      wait(20000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      System.out.println("waiting finished"); 
     } 
    } 
} 

輸出是(不斷變化的 - 有時我甚至不看「結束」印刷)

starting 
waiting 
waiting finished 
end 
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at Lean.run(Lean.java:18) 

問題:

  1. 爲什麼我得到IllegalMonitorStateException異常?

  2. 爲什麼thread.join不能按預期的方式工作? (我不看的見「結束」有時印刷)

+0

1.沒有人打斷你的線程。你有什麼證據得出結論? –

+0

我收到的例外情況? 「java.lang.IllegalMonitorStateException」 –

+0

建議:閱讀Object#wait()的Javadoc,也許你會得到一個線索。 –

回答

6

IllegalMonitorStateException拋出時需要同步操作被稱爲未持有監視器鎖定。需要在同步塊中調用wait

documentation for wait covers this

基本上你需要做的:

synchronized(this) { 
    wait(); 
} 

這有什麼好做的中斷機制。

+0

哦,我覺得自己像一個傻瓜,我怎麼能忘記這一點。會刪除我的問題當然,我會接受你的回答 –

+0

我們都有這樣的人;) – Radiodef

相關問題