2014-01-06 34 views
0

我正在創建一個學習Java線程的小應用程序。我希望有一個線程能夠分析一小部分數據(一個撲克牌手),並在檢測到手牌成功時輸出顯示消息。將數據傳遞給另一個線程,java

我已經有完成的部分完成,直到甲板爲空,我只需要弄清楚如何將該數據傳遞到分析和觸發顯示消息的其他線程(只是一個簡單的System.out) 。

我想這樣做到一個當前正在運行的線程,而不是產生一個新的線程處理和傳遞在構造函數中的卡片。

public static void main(String[] args) { 
     Deck myDeck = new PokerDeck(); 
     DeckHandlerInterface deckHandler = new DeckHandler(); 

     (new Thread(new ThreadWin())).start(); 

     for(int x = 0; x < 2; x++) { 
      while(myDeck.getDeck().size() >= deckHandler.getHandSize()) { 
       deckHandler.dealHand(myDeck.getDeck()); 
      } 
        deckHandler.resetDeck(); 
     } 

    } 

我的deckHandler返回一個集合對象,這是我想傳遞給另一個線程。這是我不知道該怎麼做的部分。

+3

當然。告訴我們你到目前爲止所做的,以及任何失敗的嘗試。 – Keppil

+0

添加了代碼片段,以及更多解釋。 – Organiccat

回答

1

您可能想要使用一對BlockingQueue s。讓生成手的線程在一個隊列中粘住手。線程檢查手輪詢該隊列並檢查找到的任何手牌。然後它將結果寫入第二個隊列,手形生成的線程可以輪詢和顯示結果。

0

有很多方法可以做到這一點。

一個簡單的方法可能是創建一個Queue,您可以通過ThreadWin構造函數傳入一個引用。
然後,您只需將您想要傳遞的對象添加到主線程的隊列中,然後在ThreadWin線程的隊列中偵聽新對象。特別是它似乎在BlockingQueue可能是一個很好的適合在這裏。

+0

還有一種方法可以用Executor來做到這一點嗎?或者我誤解了它的概念? – Organiccat

+0

@Organiccat:不管你是否使用Executor都不會改變你的狀況。這隻會影響線程的啓動和管理方式。如果您希望將數據傳遞到正在運行的線程,則需要某種消息通道,例如'BlockingQueue'。 – Keppil

0

這聽起來像你希望你的「ThreadWin」觀察(http://en.wikipedia.org/wiki/Observer_pattern)的DeckHandler

基本上,ThreadWin線程將「登記」與DeckHandler所以當DeckHandler獲得新一批PokerHands它得到通知。

當ThreadWin線程被通知時,它將「停止休息」並確定哪隻手最好。

0

您可以使用BlockingQueue來創建簡單的消費者生產者場景,甚至在文檔中還有一個簡單示例。您還應該閱讀this以更好地理解併發性。

最好的方法是使用java.util.concurrent包中的threadpool來執行任務。 Threadpool很好,易於實現,但除了使用線程池之外,你不會學到很多東西。

相關問題