gpt4 book ai didi

Java - wait() 和 notifyAll()

转载 作者:行者123 更新时间:2023-12-01 12:13:41 26 4
gpt4 key购买 nike

我一直在寻找一些关于多线程同步以及通过 wait() 和 notificationAll() 进行通信的教程来解决这个问题,但它们对我没有帮助。假设我的程序启动了 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) {

}
}

最佳答案

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

关于Java - wait() 和 notifyAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27129048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com