Ожидание и уведомление в Java: понимание IllegalMonitorStateException
В Java методы ожидания и уведомления позволяют потокам синхронизировать свое выполнение. Однако неправильное использование этих методов может привести к исключению IllegalMonitorStateException.
Чтобы понять почему, давайте проанализируем предоставленный код:
Main.java
Runner.java
Проблема заключается в вызове 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