当我注意到我在调用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
的方法,可以避免此错误,但会在每次更改时创建内部数组的副本。