Привет, я новичок в программировании, и я пытаюсь сделать простую проблему с производителем-потребителем... но, к сожалению, мой поток ждет навсегда. Не знаю, не работает ли какие-то идеи? :/
public synchronized void order() throws Exception{
System.out.println("User "+name+" requests:\n"+"cherries=" + cherries);
while(checkValues()==true){
System.out.println(name+" waiting");
wait();
}
notify();
Update();
store.toString();
System.out.println(name+" gets resources ");
Thread.sleep(5000);
}
Верьте или нет... wait()
и notify()
работают нормально.
Проблема в том, что вы не используете их правильно.
while(checkValues()==true){
System.out.println(name+" waiting");
wait();
}
notify();
Это будет ждать, пока какой-либо другой поток не уведомит об this
экземпляре для вызова метода. Это не может быть notify();
вызовите после цикла... ", потому что вы не можете добраться туда, пока не получите уведомление.
Теперь возможно, что некоторые другие потоки могут делать это notify()
, но вы не показали нам код, который делает это. И текущий код не указывает на это. И симптомы, которые вы описываете, указывают именно так.
К сожалению, я не могу понять, что на самом деле пытается сделать ваш код. Это действительно не имеет большого значения для меня. Поэтому я не могу предложить, как это исправить.
Лучшее, что я могу сделать, это предложить вам ознакомиться с некоторыми примерами правильного использования функции wait/notify. Например: