Không phải là có thể thông báo() trong một luồng khác được gọi trước khi chờ() trong một chuỗi? Nó đang xảy ra với tôi.Java thông báo() được gọi trước khi chờ()
Máy khách yêu cầu giá trị từ mục tiêu và chờ trên biến kết quả RV. Trong trường hợp mục tiêu là chính máy khách, tôi cập nhật RV với kết quả chính xác và gọi thông báo() trên RV trong một chuỗi khác.
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();
}
}
}
};
}
Vấn đề là trước khi người yêu cầu hoàn thành tất cả "mạng" (gửi chính xác trong ví dụ trên), kết quả được cập nhật trong biến kết quả. Khi chuỗi yêu cầu bây giờ gọi wait(), chương trình không tiếp tục, vì thông báo đã được gọi.
Làm cách nào để ngăn chặn?
'Trong trường hợp mục tiêu là khách hàng itself' Ý anh là gì đây? Bạn có thể đặt một số mẫu mã? – Cratylus
@shishir garg bạn có thể vui lòng dán một số mã –
Nếu không thấy mã khó trả lời - 2 bình luận mặc dù: a) nói chung là tốt hơn để sử dụng notifyAll thay vì thông báo, trừ khi bạn biết bạn đang làm gì b) thông báo có thể dễ bị lỗi và bạn nên sử dụng API đồng thời cấp cao hơn trừ khi bạn cần một cái gì đó rất cụ thể. – assylias