2013-12-02 5 views
2

Пожалуйста, объясните мне, почему мой код бросает 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(); 
} 
+0

Возможно, это один из провалов каждого объекта, имеющего встроенный замок. Ошибки, подобные этому, не пойманы. Я все еще говорю, что для всех замков должен быть специальный класс под названием «Блокировка». – Cruncher

+0

звучит как Семафор для меня. Я использую их тоже, но в этом случае его более сложно использовать по той причине, которая превышает использование этой функции. – JustAJavaProgrammer

+1

Возможный дубликат [IllegalMonitorStateException on wait() call] (http://stackoverflow.com/questions/1537116/illegalmonitorstateexception-on-wait-call) – Gray

ответ

6

можно назвать только wait() внутри synchronized блока на этом объекте.

Внутри synchronized (targetW), вы можете позвонить по телефону targetW.wait().

+0

ах, да, работал с семафорами в течение последнего месяца и снова забыл эту деталь ^^ thx – JustAJavaProgrammer

+0

@ user3038456 + 1 То же самое относится к уведомлению/уведомлению. Все, что я предполагаю, что у вас есть где-то. –

Смежные вопросы