2014-11-25 62 views
0

我一直在尋找一些關於多線程和通信的同步的教程,通過wait()和notifyAll()來解決這個問題,但他們沒有幫助我。據說,我的程序啓動了50個線程,檢查數組中的可用位置,如果沒有的話,進入等待模式。當它們結束時,notifyAll()恢復它們,以便它們可以查找空閒位置。但是,這導致了IllegalMonitorStateException的各種實例。Java - wait()和notifyAll()

@Override 
public void run() { 
    try { 
     Random rnd = new Random(new Date().getTime()); 
     boolean entrado = false; 
     int i = 0; 
     sm.acquire(); 
     synchronized (biblioteca) { 
      System.out.println("Usuario " + id + " entra"); 
      while (!entrado) { 
       for (i = 0; i < biblioteca.ordenadores.length && !entrado; i++) { 
        if (biblioteca.ordenadores[i] == 0) { 
         entrado = true; 
         break; 
        } 
       } 
       if (!entrado) { 
        System.out.println("Usuario " + id + " en la sala de espera"); 
        wait(); 
       } 
      } 

      biblioteca.ordenadores[i] = id; 
      System.out.println("Usuario " + id + " ocupa Ordenador " + i 
        + "\nOrdenadores: " + biblioteca.muestraOrdenadores()); 
     } 
     Thread.sleep(rnd.nextInt(2000)); 
     synchronized (biblioteca) { 
      System.out.println("Usuario " + id + " termina de usar el Ordenador " + i + " y sale"); 
      biblioteca.ordenadores[i] = 0; 
      notifyAll(); 
     } 
     sm.release(); 

    } catch (InterruptedException e) { 

    } 
} 
+0

什麼是「sm」?哪一行拋出'IllegalMonitorStateException'? – 2014-11-25 14:20:33

回答

1

要調用wait()thisnotifyAll()和你同步上biblioteca。您應該撥打biblioteca.wait()biblioteca.notifyAll()

+0

然後,其他選項將設置在Biblioteca中的同步方法,並在那裏調用wait()和notifyAll()(如果我是正確的)。無論如何,問題解決了。 非常感謝,先生。 – DSalas 2014-11-25 18:24:02

0

根據的JavaDoc,拋出:IllegalMonitorStateException拋出「以表明某一線程已經試圖等待對象的監視器,或者不擁有指定的監控,通知其他線程正在等待對象的監視器上。」

如在How do wait and notify really work?中所述,爲了調用foo.wait()或foo.notify(),調用線程必須擁有對象foo的鎖定。如果您在沒有先前同步(foo){的情況下調用它,則拋出此異常。

來源:http://www.jguru.com/faq/view.jsp?EID=128732

相關問題