我有一个更新系统:
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Main.frame.onUpdate();
Thread.sleep(50);
for (Entity e : Main.frame.getEntityHandler().getEntities()) {
e.onUpdate();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
有时会产生ConcurrentModificationException。为什么会这样?例外:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at de.crade.ki.logic.update.UpdateHandler$1.run(UpdateHandler.java:15)
at java.lang.Thread.run(Thread.java:745)
我该如何解决?
答案 0 :(得分:0)
如果我猜对了,这里
for (Entity e : Main.frame.getEntityHandler().getEntities()
是集合"实体"的迭代。当你在多线程环境下进行迭代时,如果其他线程修改了"实体"同时,迭代器会捕获它并抛出java.util.ConcurrentModificationException
。一个简单的解决方法是在迭代过程中添加锁定,如new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Main.frame.onUpdate();
Thread.sleep(50);
synchronized{
for (Entity e : Main.frame.getEntityHandler().getEntities()) {
e.onUpdate();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
但这会增加额外的性能损失。不确定你是否想这样做。