2

当我注意到我打电话时随机得到异常时,我正在为我的决赛制作游戏repaint();

这一切的原因是不同的对象在不同的​​时间更新,并且有自己的Thread更新自己。有时,实体在绘制时会自行更新。绘画线程以大约 60-100 FPS 的速度运行,而实体大约每 300 毫秒更新一次。

游戏不会停止或存在与此相关的任何其他问题。

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

谢谢阅读!

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

4

2 回答 2

6

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

这可能发生在不同的线程上,但它可能是同一个线程。例如,这段代码也会抛出 ConcurrentModificationException:

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

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

避免这种情况的方法:

  1. 在迭代之前制作列表的副本
  2. 只使用remove()迭代器的方法
  3. 使用类似 a 的东西CopyOnWriteArrayList来避免这个错误,但代价是在每次更改时创建内部数组的副本。
于 2012-05-26T16:14:19.193 回答
1

多线程的主要问题正是要确保尽管对象的状态在多个线程之间共享,但该状态始终保持一致。这就是为什么存在同步块,为什么存在锁,为什么存在易失变量。

忽略这个问题并希望不会发生严重的问题是灾难的根源。一切都会正常运行 1 小时,然后您将开始到处出现异常、错误结果等。

您让两个线程同时访问同一个非线程安全列表这一事实表明您的代码有问题。这是完全不正确的,绝对应该修复。

您应该同步对共享列表的访问。阅读有关 Java 并发的教程和书籍,因为在运行多个线程时同步不是一个选项。

于 2012-05-26T16:33:31.737 回答