Пожалуйста, объясните мне, почему мой код бросает IllegalMonitorStateException
на функцию ожидания, насколько я знаю, это происходит только в том случае, если это не сделано в синхронизированной части?Почему этот код вызывает исключение IllegalMonitorStateException?
private void deliver(int target) {
Warehouse targetW = targets[target];
targetW.deliver();
System.out.println(name + " starts to deliver too " +
targetW.getName());
int sleepTime = DELIVERY_TIME/LOADING_CAPACITY;
int counter = 0;
while (counter < LOADING_CAPACITY) {
synchronized (targetW) {
while (!targetW.fill(1)) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
counter++;
try {
sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
leaveMSG(targetW);
targetW.delivered();
}
Возможно, это один из провалов каждого объекта, имеющего встроенный замок. Ошибки, подобные этому, не пойманы. Я все еще говорю, что для всех замков должен быть специальный класс под названием «Блокировка». – Cruncher
звучит как Семафор для меня. Я использую их тоже, но в этом случае его более сложно использовать по той причине, которая превышает использование этой функции. – JustAJavaProgrammer
Возможный дубликат [IllegalMonitorStateException on wait() call] (http://stackoverflow.com/questions/1537116/illegalmonitorstateexception-on-wait-call) – Gray