我正在開發一款應用程序,可下載城市中不同地方的地圖圖塊。要做到這一點,我有一個線程爲每個地方我選擇瓷磚和創建一個線程下載每個。Java下載並行數據
那麼,問題是如何避免爲已經存在於線程池中的磁貼創建線程。
不應該只是檢查文件是否存在,因爲有可能該線程該圖塊已經存在(其他地方已經需要一個瓦),但該文件一直沒有created-
任何想法?謝謝
我正在開發一款應用程序,可下載城市中不同地方的地圖圖塊。要做到這一點,我有一個線程爲每個地方我選擇瓷磚和創建一個線程下載每個。Java下載並行數據
那麼,問題是如何避免爲已經存在於線程池中的磁貼創建線程。
不應該只是檢查文件是否存在,因爲有可能該線程該圖塊已經存在(其他地方已經需要一個瓦),但該文件一直沒有created-
任何想法?謝謝
您可以使用ConcurrentHashMap<Tile, Thread>
在其中存儲所有的下載器線程。
在啓動它之前,您將一個線程添加到散列映射中,並在銷燬它之前將其刪除。當然,在啓動該圖塊的線程之前,您將檢查特定的Tile
的哈希映射。
這是進入我的腦海裏最簡單的辦法,那將是很容易實現,但你必須仔細閱讀如何使用這種HashMap中的有保證的併發沒有一致性問題..
你也可以採取的HashMap的「設置」功能,通過使用
Collections.newSetFromMap(new ConcurrentHashMap<Tile,Thread>())
這樣你不會有任何關聯Tile
- >Thread
只是一個結構,你可以做一個set.contains(tile)
檢查某個線程已經安排了一個貼圖。
更好的設計可能是有一個下載的單個ExecutorService。它可以訪問BlockingQueue,它可以讀取以瞭解要下載的磁貼。在應用程序的其他地方,磁貼將被放置到這個隊列中。