2011-07-05 38 views
5

如果沒有線程在等待,使用Object.wait(),則任何對Object.notify()Object.notifyAll()的調用都不起作用。我有一種情況,如果在等待集爲空時調用Object.notify(),則後續調用Object.wait()時不應讓該線程等待。這如何實現?信號量可能是我能想到的一個解決方案。有沒有更優雅的解決方案?在Object.wait()之前調用Object.notify()

回答

7

這種情況似乎是一個完美的適合Semaphore。請致電Semaphore.release()而不是notify()Semaphore.acquire()而不是等待。

7

使用標誌來指示通知。在進入等待之前閱讀標誌並採取相應措施。

boolean stopped = false; 

public void run(){ 
    synchronized(object){ 
     while(!stopped) 
     object.wait(); 
    } 

} 

public void stop(){ 
    synchronized(object){ 
    stopped=true; 
    object.notify(); 
    } 

} 
+0

感謝您的快速響應。 –

+1

+1:任何狀態改變都可以記錄notify()被調用的事實。 –

4

我會用SemaphoreCyclicBarrier或可能CountDownLatch - 無論是你真實的情景更適合。我認爲重複使用現有的抽象是一個好主意,而不是自己使用底層機制,除非這些機制給予你完全想要的行爲(在這種情況下他們不這樣做)。

+0

感謝您的好建議。我想信號量對我所擁有的場景來說是最好的。 –

0

我實現像這樣

線程A:

req.run(); 
synchronized (req) { 
        try { 
         req.wait(3000); 
         rawResponse = eq.ReturnXML; 
         logger.info("[" + refID + "] Response recieved: " + rawResponse); 
         responseRecieved = true; 
         req.notify(); 
        } catch (InterruptedException ex) { 
         logger.error("Error waiting on req", ex); 
        } 
       } 

線程B:

synchronized (req) { 
     while (!responseRecieved) { 
      try { 
       req.wait(3000); 
      } catch (InterruptedException ex) { 
       logger.error("Error waiting on req while trying to get state", ex); 
      } 
     } 
    } 

線程A使一個響應該請求並等待,在此同時線程B是隻等待迴應。如果響應已經到達,它不會等待。

相關問題