Возможно ли, что notify() в другом потоке вызывается перед wait() в одном потоке? Это происходит со мной.Java notify() вызывается перед wait()
Клиент запрашивает значение от цели и ждет результата переменной RV. В случае, если целью является сам клиент, я обновляю RV с правильным результатом и вызываю notify() на RV в другом потоке.
class EMU {
ResultVar RV;
Address my_address;
ResultVar findValue(String key) {
String tgt = findTarget(key);
sendRequest(tgt, key);
synchronized(RV) {
RV.wait();
}
return RV;
}
Runnable Server = new Runnable() {
public void run() {
//code to receive connections. Assume object of type Request is read from the stream.
Request r = (Request) ois.readObject();
if(r.requesterAddr.compareTo(my_address) == 0) {
String val = findVal(key);
RV.putVal(val);
synchronized(RV){
RV.notify();
}
}
}
};
}
Проблема заключается в том, что до того, как запрашивающих завершил все «сети» (sendReqest в приведенном выше примере), с самими собой, то результат будет обновлен в переменном результате. Когда поток-запросчик теперь вызывает wait(), программа не будет продолжена, так как уведомление уже вызвано.
Как мы можем предотвратить это?
'В случае цель клиента itself' Что вы имеете в виду здесь? Можете ли вы поместить образец кода? – Cratylus
@shishir garg не могли бы вы вставить код –
Не видя кода, вам сложно ответить - 2 комментария: а) обычно лучше использовать notifyAll, а не уведомлять, если вы не знаете, что делаете b) используя wait и уведомление может быть подвержено ошибкам, и вы должны использовать API параллелизма более высокого уровня, если вам не требуется что-то очень конкретное. – assylias