wait()/接收通知时通知当前线程的异常行为

时间:2013-10-30 11:36:39

标签: java multithreading wait notify

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关键字。它将如何表现以及任何正确的方法。

1 个答案:

答案 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产生新线程是完全不可能的,因为你在新线程中所做的一切都可以在调用它的线程中完成。