2013-02-08 104 views
2

你好我試圖使用semaphore.aqcuire()semaphore.release()同步類。我從名爲ReadSerialPort的類中撥打semaphore.release(),從WriteSerialPort撥打semaphore.aqcuire(),以將電話中心連接到PC。我的問題是電話中心並不總是響應。Java:使用信號量和定時器

我想知道一種方法來設置計時器,並在時間過去後使semaphore.release()

P.S:我嘗試使用TimedSemaphore類,但什麼都沒有發生

+5

它會是一個選項,把邏輯在收購方?有Semaphore.tryAcquire(超時) – 2013-02-08 15:54:39

+1

你描述的模式並沒有什麼意義。您需要確保以「正常」方式調用'release()',並根據需要在阻止呼叫時使用超時。 (如果沒有代碼和共享資源的概述以及它們發生了什麼,很難說清如何修復你的問題。) – millimoose 2013-02-08 15:54:51

+1

在定時器上釋放信號量可能會使事情以不好的方式破壞,因爲我認爲有一個原因它已被收購。你通常所做的就是試圖用超時獲得它,如果持有信號量的線程不會放棄它,就放棄它。這樣,你就會知道一些事情,並不認爲它是以正常方式發佈的。 – 2013-02-08 15:57:24

回答

3

我的問題的答案,由Jan Goynvaeis使用semaphore.tryAcquire(10,TimeUnit.SECONDS)解決,使10秒後採集將超時。在超時後使用信號量。發佈(0)來清除線程