여러 스레드의 동기화에 대한 자습서를 찾고 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) {
}
}
'sm'이란 무엇입니까? 'IllegalMonitorStateException'을 던지는 행은 무엇입니까? –