java.util.ConcurrentModificationException Non un Programme Multithread
Hé oui, Gourou de l'im ayant un diable d'un emploi avec ce code
public void kill(double GrowthRate, int Death)
{
int before = population.size();
for (PopulationMember p : population)
{
int[] probs = ProbablityArrayDeath(GrowthRate,Death,(int)p.fitness());
if (probs[RandomNumberGen.nextRandomInt(0, 99)]==0)
{
population.remove(p);
}
}
System.out.println("Intial Population: "+before+", Deaths:"+(before- population.size())+", New Population: "+population.size());
}
Quand je lance mon programme, la première fois qu'elle essaie d'exécuter le code qu'il rencontre cette erreur
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at Genetics.Population.kill(Population.java:181)
at Genetics.Population.run(Population.java:47)
at Control.Main.main(Main.java:35)
Avoir goggled un peu autour de ce qui semble être une erreur qui se passe normalement avec les threads pourquoi ils essaient et accéder à la même ressource simultanément, mais c'est ce que m'im pas le multithreading dans ce système.
Quelqu'un peut m'expliquer pourquoi ce qui se passe, ou de penser à un hack pour contourner
Merci beaucoup ^_^
OriginalL'auteur Gwilym | 2009-11-29
Vous devez vous connecter pour publier un commentaire.
Vous pouvez modifier le sous-jacent
Collection
de laIterator
(qui est caché dans lefor-each
boucle).La bonne façon de le faire est:
OriginalL'auteur Bozho
Vous ne pouvez pas utiliser la
for each
boucle si vous supprimez les choses de la collection.Vous devez utiliser un
Iterator
et pour supprimer l'élément en cours d'appelIterator.remove
.Sinon, le sous-jacent itérateur que la boucle for-each crée pour vous les coulisses de ne pas comprendre comment se fait la collecte de il la traverse est en train de changer, vous dit qu'il est en train d'être modifié pendant que vous parcourez.
Itérateur est pas nécessairement de mettre en œuvre cette méthode (par java.sun.com/javase/6/docs/api/java/util/...).
auquel cas on ne devrait pas enlever des choses au cours d'une itération à tous.
Inmodifiable des collections des itérateurs n'ont pas cette méthode de mise en œuvre, mais "normales", les collections de ne.
OriginalL'auteur abyx
Vous avez un itérateur sur la population cachée sous une boucle for.
Vous êtes en train de supprimer un élément à partir de la population au milieu de l'itérateur de travail.
Itérateur peut pas ne pas travailler plus parce que vous avez changé la collection dans le milieu de l'itération.
Il n'est pas lié à multithreading.
OriginalL'auteur Yoni Roit
Une solution de contournement peut être la copie d'une collection. Itérer sur les copier et de supprimer des éléments de la collection d'origine.
}
OriginalL'auteur Eugene Platonov