我一直在寻找一些有关多线程同步以及通过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) {

    }
}

最佳答案

您正在调用wait()notifyAll()this,并且正在biblioteca上进行同步。您应该呼叫biblioteca.wait()biblioteca.notifyAll()

10-08 16:15