private boolean getNodeReachability(final String ip) {
// TODO Auto-generated method stub
if(!nodeReachabilityStatusMap.containsKey(ip)){
statusAvailable = Boolean.FALSE;
new Thread(){
public void run(){
while(true){
if(nodeReachabilityStatusMap.containsKey(ip)){
statusAvailable = Boolean.TRUE;
notifyAll();
break;
}
}
}
}.start();
while(statusAvailable==Boolean.FALSE){
try{
wait(5000);
}catch(InterruptedException ex){
Log.addInLog(Log.DBG, ex.getMessage());
}
}
}
return nodeReachabilityStatusMap.get(ip);
}
实际上getNodeReachability
函数返回节点access或NOT的状态,该节点在nodeReachabilityStatusMap
中维护,我将在获取通知的其他代码段中更新。
问题是如果通知被延迟,那么我需要等到我在这张地图中找到条目。所以我产生新的thred(在函数内部),它正在检查并通知当前线程。我没有使用synchronized关键字。它将如何表现以及任何正确的方法。
答案 0 :(得分:0)
调用线程必须保持对象的监视器锁定以调用该对象上的wait()
,notify()
和notifyAll()
。因此,您必须在某个对象上同步代码并将其用于同步,例如。
synchronized(someObject){ // can be "this" or anything that is not null and primitive
someObject.wait()
}
// on another thread
synchronized(someObject){
someObject.notify();
}
IMHO产生新线程是完全不可能的,因为你在新线程中所做的一切都可以在调用它的线程中完成。