2013-10-30 50 views
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函数返回节点的访问或NOT状态,其被保持在nodeReachabilityStatusMap,其中我在其他代码段上的通知更新。 问题是,如果通知正在延迟,那么我需要等到我在此地图中找到条目。所以我正在产生新的thred(在函数内部),它正在检查并通知当前线程。我没有使用synchronized关键字。所以它将如何表现以及如何正确执行它。等待()/通知用于当前线程异常行为而接收通知

+0

你不告诉我们什么是错的。基于代码,你会得到'IllegalMonitorStateException' –

+0

其实我有点困惑,我们是否可以在同步块中应用等待/通知或可以独立使用? – Krishna

+0

异常根本没有异常。 – Antoniossss

回答

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

恕我直言产卵新线程是完全unnececery,因为你在新线程中做的一切都可以在线程调用它。

+0

但有一个疑问,比如在我让给定的函数同步之后,并且在那个函数中,我产生了一个新的线程,它将检查hashmap中的条目,如果它存在,我需要通知。那么这将是什么行为。我的意思是我们的模块是这样的'synchronized(someObject){//可以是“this”或任何非null和primitive的东西 \ n new Thread(){\ n public void run(){\ n // if entry当前\ n通知();}}。start(); \ n someObject.wait()} } – Krishna

+0

同步方法与'this'对象上的同步块相同。 – Antoniossss