当我注意到我在调用repaint();时随机获得Exception时,我正在为决赛做游戏

造成这种情况的原因是,不同的对象在不同的​​时间进行更新,并具有自己的Thread进行更新。有时,实体在绘制时会进行自我更新。绘画线程的运行速度约为60-100 FPS,而实体大约每300毫秒更新一次。

游戏没有停止或与此相关的任何其他问题。

我知道忽略它是一个坏主意,但是我还能做些其他事情吗?有多个线程是让游戏正常运行的唯一解决方案。

谢谢阅读!

编辑:当我尝试在绘画时删除实体时,似乎发生了此问题;两者都使用相同的列表。

最佳答案

ConcurrentModificationException与多线程无关(尽管可能涉及多个线程)。当您通过List方法以外的方法从集合中添加或删除项目时,当您遍历集合(例如Iterator.remove())时,会发生这种情况。

这可能发生在不同的线程上,但是可能是同一线程。例如,这段代码还将引发ConcurrentModificationException:

Iterator iter = someList.iterator();
while(iter.hasNext()) {
   Object item = iter.next();
   someList.remove(item);
}


如果改为调用iter.remove(),则不会发生该错误。

避免这种情况的方法:


在遍历列表之前先对其进行复制
仅使用迭代器的remove()方法
使用类似CopyOnWriteArrayList的方法,可以避免此错误,但会在每次更改时创建内部数组的副本。

10-05 18:24