Java下载并发数据

Java下载并发数据,java,concurrency,Java,Concurrency,我正在开发一个应用程序,可以下载城市不同地方的地图。为了做到这一点,我在每个地方都有一个线程,在这里我选择了这些分片并创建了一个线程来下载每个分片 问题是如何避免为线程池中已经存在的磁贴创建线程 不应只是检查文件是否存在,因为该磁贴的线程可能已经存在(其他地方已经需要该磁贴),但文件尚未创建- 有什么想法吗?谢谢您可以使用ConcurrentHashMap存储所有下载线程 在启动hashmap之前向其添加线程,并在销毁它之前将其删除。当然,在启动该磁贴的线程之前,您将检查hashmap中特定的磁

我正在开发一个应用程序,可以下载城市不同地方的地图。为了做到这一点,我在每个地方都有一个线程,在这里我选择了这些分片并创建了一个线程来下载每个分片

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

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


有什么想法吗?谢谢

您可以使用
ConcurrentHashMap
存储所有下载线程

在启动hashmap之前向其添加线程,并在销毁它之前将其删除。当然,在启动该磁贴的线程之前,您将检查hashmap中特定的
磁贴

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

您还可以使用

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

这样,您就不会有任何关联
Tile
->
Thread
,而只是一个结构,您可以为它设置
set.contains(Tile)
,以检查某个线程是否已经安排了一个Tile。

更好的设计可能是有一个单独的线程来进行下载。它可以访问从中读取的文件,以了解要下载的磁贴。在应用程序中的其他位置,分片将放置在此队列上