2013-02-23 85 views
1

我有一個監聽請求的類(服務器),一旦發出請求,就啓動一個處理它的新線程。處理程序線程將讀取數據,將其存儲到散列表中並完成。我已經把哈希映射到服務器類中,因爲可以有多個處理線程在數據中讀取和當它進來。Java線程 - 改變老闆hashmap的工作線程

我很困惑這是否是正確的方法,因爲要改變/訪問哈希映射,我必須寫getters & setter並將Server類傳遞給每個工作線程。一些示例代碼來嘗試和描述我的查詢:

public class Server implements Runnable { 
     private HashMap<String, Integer> data; 

    public void run() { 
     while(true) { 
      Socket s = serverSocket.accept(); 
      Handler h = new Handler(s); 
      Thread t = new Thread(h); 
      t.start(); 
     } 
    } 
} 

public class Handler implements Runnable { 

    public void run() { 
     //read in data from socket 
     data.put(d); //access the hashmap and insert data in 
    } 

} 

任何意見將不勝感激。謝謝。

+0

確保在使用多線程時使用concurrenthashmap,否則可能會遇到一些奇怪的錯誤。這將處理所有對hashmap的同步訪問。 – 2013-02-23 20:28:28

回答

3

您的方法很好,但您應該在地圖上使用ConcurrentMapsynchronize。第一種方法更好,因爲只要有可能,同步收集就是optimized in order to avoid blocking

+0

感謝Javier的建議,我改變了我的代碼中的類型。我仍然想知道是否將服務器線程傳遞到處理程序線程以添加數據是一種好的做法,因爲多個處理程序線程可以保存相同的服務器線程。 – user1087943 2013-02-23 20:41:09

+0

在這種情況下,爲什麼不把hashmap的實例傳遞給處理程序,因爲這是你需要的唯一對象。 – 2013-02-23 20:43:09

+0

好點。當處理程序線程中的ConcurrentMap被更改時,ConcurrentMap會在服務器線程中更新嗎? – user1087943 2013-02-23 20:47:47