2010-06-14 37 views
0

我正在開發一款應用程序,可下載城市中不同地方的地圖圖塊。要做到這一點,我有一個線程爲每個地方我選擇瓷磚和創建一個線程下載每個。Java下載並行數據

那麼,問題是如何避免爲已經存在於線程池中的磁貼創建線程。

不應該只是檢查文件是否存在,因爲有可能該線程該圖塊已經存在(其他地方已經需要一個瓦),但該文件一直沒有created-

任何想法?謝謝

回答

2

您可以使用ConcurrentHashMap<Tile, Thread>在其中存儲所有的下載器線程。

在啓動它之前,您將一個線程添加到散列映射中,並在銷燬它之前將其刪除。當然,在啓動該圖塊的線程之前,您將檢查特定的Tile的哈希映射。

這是進入我的腦海裏最簡單的辦法,那將是很容易實現,但你必須仔細閱讀如何使用這種HashMap中的有保證的併發沒有一致性問題..

你也可以採取的HashMap的「設置」功能,通過使用

Collections.newSetFromMap(new ConcurrentHashMap<Tile,Thread>()) 

這樣你不會有任何關聯Tile - >Thread只是一個結構,你可以做一個set.contains(tile)檢查某個線程已經安排了一個貼圖。

0

更好的設計可能是有一個下載的單個ExecutorService。它可以訪問BlockingQueue,它可以讀取以瞭解要下載的磁貼。在應用程序的其他地方,磁貼將被放置到這個隊列中。