Gwi*_*lym 15 java collections multithreading java.util.concurrent
嘿SO Guru,我对这段代码有一点工作
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());
}
Run Code Online (Sandbox Code Playgroud)
当我第一次尝试运行代码时运行我的程序时,它会遇到此错误
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)
Run Code Online (Sandbox Code Playgroud)
稍微晃了一下这似乎是一个错误,通常会发生在线程为什么他们尝试同时访问相同的资源,但这就是让我在这个系统中完全没有多线程的原因.
有人可以解释为什么会这样,或者想到一个黑客来解决它
非常感谢^ _ ^
Boz*_*zho 41
您可以修改底层Collection的Iterator(这是隐藏在for-each环).正确的方法是:
for (Iterator<PopulationMember> it = population.iterator(); it.hasNext();) {
PopulationMemeber p = it.next();
int[] probs = ProbablityArrayDeath(GrowthRate,Death,(int)p.fitness());
if (probs[RandomNumberGen.nextRandomInt(0, 99)] == 0) {
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
aby*_*byx 12
for each如果从集合中删除内容,则无法使用循环.
您必须使用Iterator和删除当前项目调用Iterator.remove.
否则,for-each循环在幕后为您创建的底层迭代器不会理解它正在经历的集合是如何变化的,它告诉您在迭代它时它正在被更改.
| 归档时间: |
|
| 查看次数: |
20679 次 |
| 最近记录: |