2011-04-10 66 views
0

我正在做一個項目,我必須讓線程通信。Java線程溝通

例如

我有兩個線程陣列,c[100]e[10]。 (客戶和員工)

一旦客戶說c[3]獲取信號,讓它與員工的一個發言說員工e[5],我怎麼通過線程c[3]代表到Employee對象e[5]Customer對象相關聯,並讓他們來回傳遞信息?

+0

可能的重複[與Java線程之間的管道數據](http://stackoverflow.com/questions/5602904/piping-data-between-threads-with-java) – trashgod 2011-04-10 20:55:50

回答

1

對於允許線程之間的通信信息多種技術。最簡單的方法是通過共享狀態進行互斥。消息隊列是最經典的可擴展方法之一。您需要使用的方式取決於作業分配的陳述。

一般來說,保護共享的狀態,您的同步原語(無論是互斥或信號或其他),並讓非共享狀態的正常運行。如果你有員工和顧客,也許他們通過他們共享的「郵件插槽」進行通信。使用您的信號保護郵件插槽,以防止其他人在寫入時嘗試閱讀(反之亦然),並且您將擁有所需的主要策略。

+0

我仍然不確定我理解如何做它。我想解釋這個最好的辦法就是想到一家雜貨店。你有多個客戶c [0-99]可以去任何可用的收銀員e [0-10]。一旦收銀員在他們的結賬線上有一位顧客,他們必須通過顧客與收銀員溝通食品雜貨,然後收銀員必須將總數交給給顧客,顧客把食品交給顧客,然後顧客必須看他們的錢包並且製作肯定他們有足夠的錢。因此,通過消息隊列,您將如何區分應該發送給每個實體的信息? – JustinY17 2011-04-10 21:32:12

+0

所以我想回到原來的問題,我如何關聯由每個線程表示的兩個對象?帶有員工的客戶,以便他們可以交換信息。 – JustinY17 2011-04-10 21:33:55

+0

您需要閱讀The Java Tutorials on Concurrency http://download.oracle.com/javase/tutorial/essential/concurrency/index.html – 2011-04-10 23:37:53

0

另一個方式是通過消息傳遞。例如,您可以爲一個對象訂閱事件的偵聽器。當另一個線程引起更改時,它讓所有監聽者知道該事件,並且所有監聽者都會收到通知。

另一種可能的解決方案是使用管道流或管道重做(即PidedInputStrean,PipedOutputStream,PipedReader,PipedWriter)。在這個方案中,一個線程寫入管道的一側,另一個線程讀取另一側。

而且我敢肯定還有其他幾種方法來做到這一點。