2017-08-06 16 views
2

我正在處理一個簡單的項目,它將發送多個HTTP請求以檢索某些數據,解析每個URL的響應,並返回包含原始URL和一些有關信息的響應數據(線程使用的原因顯然是多個HTTP請求)。
如果在這種情況下有最佳實踐,我就會徘徊,下面是我心中想到的選項:
1.讓每個線程發送一個HTTP請求。解析數據以獲取所需信息並返回信息本身(在線程完成後通過Future<SomeDataType>或簡單的DataType getInformation()調用完成),然後在原始線程中創建URL-SomeDataType對
2.每個線程獲取同步列表/映射的附加參數,線程將添加URL-Information對(列表/映射的相同實例將在所有線程之間共享)。
3.較不可能的選項 - 讓每個線程只是拉動信息,並以1/2提到的任何一種方式返回,而不是解析主線程中的所有信息(這會降低性能,但幾乎需要0次同步處理,這是很好)從多個線程返回數據Vs積累響應

是否有類似的情況最佳做法?
謝謝!

+1

從同步的角度來看,選項2和3是等效的。沒有區別 - 傳輸來自請求或處理數據的所有數據。 第一種選擇既複雜又緩慢。 –

回答

0

在我看來,選項1是最乾淨的,並符合最佳實踐。實施它的首選方法是使用執行者框架(線程池和可加密)。選擇理由 -

  1. 問題分離 - 每個線程都會獨立返回其工作結果。之後,主線程的工作就是採取這種結果並按照喜歡的方式進一步處理它(例如,將其放入地圖或將其合併到其他地方)。將來,如果您發現了一種更好/更清晰的聚合結果方式 - 那麼這種改變最可能不會影響工作線程自己做或返回的內容。

  2. 選項2將涉及不必要的同步(儘管可以使用ConcurrentHashMap使其最小化)。更大的問題 - 它混合了主線程和工作線程之間的問題。工作者線程現在「知道」了一下結果(他們的擔心應該只是 - 獲得結果)

  3. 如您所說,選項3會降低性能。如果每個線程獲取的信息彼此獨立,那麼讓每個線程解析該信息並返回它是有意義的。