Czy to możliwe, że notify() w innym wątku zostanie wywołane przed wait() w jednym wątku? To się ze mną dzieje.Java notify() zostaje wywołana przed wait()
Klient żąda wartości od celu i czeka na zmienną wyników RV. Jeśli celem jest sam klient, aktualizuję RV z poprawnym wynikiem i wywołuję notify() na RV w innym wątku.
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();
}
}
}
};
}
Problem polega na tym, że przed wnioskodawca ukończył wszystkie „sieci” (sendReqest w powyższym przykładzie) ze sobą, wynik jest aktualizowany w zmiennej wynikowej. Gdy wątek requestera wywoła funkcję wait(), program nie będzie kontynuowany, ponieważ powiadomienie zostało już wywołane.
Jak możemy temu zapobiec?
'W przypadku, gdy celem jest klient itself' Co masz na myśli tutaj? Czy możesz umieścić próbkę kodu? – Cratylus
@shishir garg czy możesz wkleić kod –
Nie widząc kodu trudno jest odpowiedzieć - 2 komentarze jednak: a) ogólnie lepiej jest użyć powiadomienia zamiast powiadamiać, chyba że wiesz co robisz b) używając wait i powiadomienie może być podatne na błędy i powinieneś używać interfejsu API wyższego poziomu, chyba że potrzebujesz czegoś bardzo specyficznego. – assylias