Java下载并发数据

时间:2010-06-14 10:54:33

标签: java concurrency

我正在开发一款应用程序,可以在城市的不同位置下载地图图块。为此,我在每个地方都有一个线程,我在其中选择磁贴并创建一个线程来下载每个磁贴。

嗯,问题是如何避免为线程池中已存在的磁贴创建线程。

不应该只是检查文件是否存在,因为该图块的线程可能已经存在(其他地方已经需要该图块)但是文件尚未创建 -

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:2)

您可以使用ConcurrentHashMap<Tile, Thread>存储所有下载程序线程。

在启动之前向hashmap添加一个线程,然后在销毁之前将其删除。当然,在为该磁贴启动线程之前,您将检查特定Tile的哈希映射。

这是我想到的最简单的解决方案,它很容易实现,但你必须仔细阅读如何使用这种hashmap来保证并发性,没有一致性问题。

您也可以使用

来获取hashmap的“set”功能
Collections.newSetFromMap(new ConcurrentHashMap<Tile,Thread>())

通过这种方式,您不会有任何关联Tile - &gt; Thread,而只是一个结构,您可以set.contains(tile)检查是否已安排了某个磁贴通过一些线程。

答案 1 :(得分:0)

更好的设计可能是让一个ExecutorService进行下载。它可以访问它所读取的BlockingQueue以了解要下载的磁贴。在您的应用程序的其他地方,瓷砖将被放置在此队列中。