0
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函数返回节点可访问或不可访问的状态,该状态正在维护中nodeReachabilityStatusMap,我将在其他代码部分中更新获取通知。问题是如果通知被延迟,那么我需要等到我在这张地图中找到条目。所以我正在生成新的线程(在函数内部),它正在检查和通知当前线程。我没有使用同步关键字。所以它会如何表现以及任何正确的方法。

4

1 回答 1

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();
}

恕我直言,产生新线程是完全不必要的,因为您在新线程中所做的一切都可以在线程调用它时完成。

于 2013-10-30T11:51:31.627 回答