Multithreading ConcurrentModificationException-多重读取
我有一个更新系统:Multithreading ConcurrentModificationException-多重读取,multithreading,exception,arraylist,concurrentmodification,Multithreading,Exception,Arraylist,Concurrentmodification,我有一个更新系统: new Thread(new Runnable() { @Override public void run() { while (true) { try { Main.frame.onUpdate(); Thread.sleep(50); for (Entity e :
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)
我怎样才能解决这个问题呢?如果我猜对了,在这里
for(实体e:Main.frame.getEntityHandler().getEntities()
是集合“实体”上的迭代。在多线程环境下进行迭代时,如果其他线程修改了“实体”同时,迭代器会捕捉到这一点,并抛出java.util.ConcurrentModificationException
。一个简单的解决方法是在迭代过程中添加锁,就像下面的新线程(new Runnable(){
@凌驾
公开募捐{
while(true){
试一试{
Main.frame.onUpdate();
睡眠(50);
同步的{
对于(实体e:Main.frame.getEntityHandler().getEntities()){
e、 onUpdate();
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
}
}).start();
但这会增加额外的性能损失。不确定是否要这样做。在理解多线程之前,不要使用多线程。