2014-11-25 67 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

相关问题