«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему я получаю исключение IllegalMonitorStateException при использовании Java Wait and Notify?

Почему я получаю исключение IllegalMonitorStateException при использовании Java Wait and Notify?

Опубликовано 14 ноября 2024 г.
Просматривать:375

Why Am I Getting IllegalMonitorStateException When Using Java\'s Wait and Notify?

Ожидание и уведомление в Java: понимание IllegalMonitorStateException

В Java методы ожидания и уведомления позволяют потокам синхронизировать свое выполнение. Однако неправильное использование этих методов может привести к исключению IllegalMonitorStateException.

Чтобы понять почему, давайте проанализируем предоставленный код:

Main.java

  • В конструкторе основной поток создает несколько потоков и добавляет их в ArrayList.
  • После печати сообщения «Раннеры готовы» он вызывает notifyAll() для уведомления всех потоков.

Runner.java

  • В методе run() каждый бегун вводит условие wait(), ожидая уведомления от основного потока.

Проблема заключается в вызове wait() в Runner.run(). Когда поток вызывает функцию wait() для объекта, он должен владеть монитором этого объекта. Право собственности устанавливается путем синхронизации объекта.

Чтобы устранить проблему, синхронизируйте Main.main в вызове wait():

class Runner implements Runnable {
  public void run() {
    try {
      synchronized (Main.main) {
        Main.main.wait();
      }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }
}

Это гарантирует, что текущий поток владеет монитором Main.main перед входом в условие wait().

Тот же принцип применяется к notify() и notifyAll(). Прежде чем выдавать эти методы, поток должен владеть монитором объекта.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3