2013-06-27 31 views
2

我的應用程序有一個singleton類(與串行COM端口通信)處理來自多個線程的數據請求。在處理請求時,線程應爲wait()。我如何通知線程數據已準備就緒(並將其發回)而不喚醒所有正在等待的線程?發送數據到一個特定的線程

+4

如果您不需要使用Java 1.4,則應該使用來自'java.util.concurrent'的對象,而不要使用'wait/notify'。 –

+2

我會使用[BlockingQueue](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html) - 使用隊列上的'take'來讓線程等待直到數據準備就緒 –

+1

單身是多人編程的噩夢。 – 2013-06-27 21:03:39

回答

3

爲每個線程創建一個blocking queue並將它們注入到Singleton中。當有任何答案到達時,只需選擇適當的線程隊列,並將提供(E o)方法的消息放入其中。

在使用take()方法的線程中,您可以等待無限時間的答案,或者使用輪詢(超時時間,TimeUnit單位)進行時間盒等待。

您可以使用額外的concurrent queue來餵養單身人士而不會阻止它。

2

雖然@Lexandro有一個很好的答案,但一個更簡單的替代方案可以滿足您的需求(據我所知,線程等待/阻塞是o.k.)就是在靜態類中同步該方法。

+0

我同意你的看法,但是我個人更喜歡沒有使用同步塊/方法的解決方案。 – Lexandro

+0

同意。我會給你一個upvote。 – user949300

+0

我嘗試了一個類似的解決方案,但沒有工作。原因是有一個'serialPortActionListener''wich接收所有數據。但是每個數據包都會被加入到特定的線程中(當線程向無線電傳輸者請求數據時,它會發回他們的地址,以便將數據傳送給正確的客戶端)。就像我看到的那樣,有一個'serialPortActionListener'實例需要將數據重定向到特定的線程。所以我需要不斷地參考每個線程。 – BrunoPires

相關問題