2010-06-14 2 views
0

Je développe une application qui télécharge des tuiles de carte autour de différents endroits dans une ville. Pour ce faire, j'ai un fil pour chaque endroit dans lequel je sélectionne les tuiles et créer un fil pour télécharger chacun. Eh bien, la question est de savoir comment éviter de créer un thread pour une tuile qui existe déjà dans le pool de threads.Java Télécharger les données concurrentes

ne doit pas seulement vérifier si le fichier existe, car il est possible que le fil de cette tuile existe déjà (autre endroit besoin déjà que la tuile), mais le fichier n'a pas été créé-

Toute idée? Merci

Répondre

2

Vous pouvez utiliser un ConcurrentHashMap<Tile, Thread> dans lequel vous stockez tous les threads de téléchargement.

Vous ajoutez un thread à la hashmap avant de le démarrer et vous le supprimez avant de le détruire. Bien sûr, vous allez vérifier la hashmap pour un Tile spécifique avant de commencer un thread pour cette tuile.

Ceci est la solution la plus simple qui me vient à l'esprit, il serait facile à mettre en œuvre, mais vous devrez lire attentivement la façon d'utiliser ce genre de hashmap avoir garanti sans concurrence problèmes de cohérence ..

vous pouvez aussi prendre le « set » de la fonction hashmap en utilisant cette façon

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

vous pas une association Tile ->Thread mais juste une structure pour laquelle vous pouvez faire un set.contains(tile) pour vérifier si une tuile a déjà été programmée par un thread.

0

Une meilleure conception pourrait être d'avoir un seul ExecutorService qui fait le téléchargement. Il a accès à un BlockingQueue qu'il lit pour savoir quelles tuiles à télécharger. Ailleurs dans votre application, les tuiles seraient placées dans cette file d'attente.