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