Java - wait()和notifyAll()

时间:2014-11-25 14:16:37

标签: java multithreading

我一直在寻找一些有关多线程同步和通过wait()和notifyAll()进行通信的教程来解决这个问题,但是他们并没有帮助我。据说,我的程序启动50个线程,检查数组中的可用位置,如果没有则进入等待模式。当他们结束时,notifyAll()恢复他们,所以他们可以寻找自由职位。但是,这会导致IllegalMonitorStateException的各种实例。

@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) {

    }
}

2 个答案:

答案 0 :(得分:1)

您正在呼叫wait()的{​​{1}}和notifyAll(),并且您正在this进行同步。您应该致电bibliotecabiblioteca.wait()

答案 1 :(得分:0)

根据JavaDoc,抛出IllegalMonitorStateException“以指示线程已尝试在对象的监视器上等待或通知在对象的监视器上等待的其他线程而不拥有指定的监视器。”

How do wait and notify really work?中所述,为了调用foo.wait()或foo.notify(),调用线程必须拥有对象foo的锁。如果在没有前面的synchronized(foo){。

的情况下调用它,则抛出此异常

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