2015-05-15 80 views
4

我正在與ThreadJava中工作,我得到以下錯誤 - 我不明白爲什麼?!線程「主」中的異常java.lang.IllegalMonitorStateException

代碼:

import java.util.Random; 

public class Test { 


    public static void main(String[] args) throws InterruptedException { 
    Vlakno sude = new Vlakno("myName"); // Vlakno = thread class 

     sude.start(); 
     sude.wait(); // ERROR IS ON THIS LINE 
    } 

} 

class Vlakno extends Thread { 

    private boolean canIRun = true; 
    private final String name; 

    Vlakno(String name) { 
     this.name = name; 
    } 

    @Override 
    public void run() { 
     while (canIRun) { 
      // System.out.println("Name: " + name); 
     } 
    } 

    public void mojeStop() { 
     System.out.println("Thread "+name +" end..."); 
     this.canIRun = false; 
    } 
} 

回答

4

爲了應對IllegalMonitorStateException必須 驗證wait方法的所有invokations只 發生時調用線程擁有適當的顯示器。最簡單的 解決方案是將這些調用包含在​​塊中。在​​ 語句中應該調用的同步對象是其監視器必須被獲取的那個對象。

synchronize (sude) { 
    sude.wait(); 
} 

欲瞭解更多信息和例子,看看here

0

Object.wait

拋出:IllegalMonitorStateException的Java文檔 - 如果當前線程不是這個對象監視器的所有者 。

調用sude.start();後有兩個線程正在運行:當前線程和正在運行的線程sude。當前線程不是對象監視器的所有者。

要確保你是這個對象監視器的所有者做到這一點:

synchronize (sude) { 
    sude.wait(); 
} 
相關問題