【发布时间】:2014-07-15 08:54:19
【问题描述】:
我目前正在为学校开发一个小项目,它是一款塔防游戏。
初始化游戏时,它会启动一个计算所有内容的线程。启动该线程后,我的代码跳入一个循环,循环我的图形代码。我认为它正在使用 2 个线程。一个线程用于计算,另一个是“标准”线程,在您打开程序时使用。
现在我想将射弹添加到我的塔中。为此,我需要向我的实体 ArrayList 添加一个新的 Projectile 对象。每当我尝试这样做时,它都会说
线程“主”java.util.ConcurrentModificationException 中的异常
并指向我的图形循环所在的行,它试图循环我的实体数组。这是有道理的,因为当我的 Projectiles 添加到这个数组中时,我的 graphicsloop 会尝试读取。我尝试使用“同步”,我想我知道如何使用它以及它的用途,但我不确定我会在我的代码中使用它的什么地方。我从昨天开始尝试解决这个问题,但在互联网上找不到任何解决方法。另外我不确定哪段代码对你有帮助,如果你不明白我的程序是如何工作的以及问题是什么,所以如果你需要什么,请随时询问。
如果有人能帮我解决这个问题,我已经想感谢你了,如果你还在阅读,那就太棒了
编辑:我认为这些是重要的代码:
世界更新方法:
private void updateRunning() {
waveTimer();
for (Entity e : entities) {
if (e.isMonster() && !block) {
e.toMonster().move();
if (e.toMonster().getHealth() <= 0)
entities.remove(e);
} else if (e.isTower()) {
e.toTower().setTarget(e.toTower().findTarget());
e.toTower().shoot();
} else if (e.isProjectile()) {
e.toProjectile().update();
}
}
}
渲染器循环方法:
private void updateRunning() {
cam.update();
for (Entity ent : world.getEntities()) {
ent.draw();
}
cursor.update();
cursor.draw(); // Must always be on bottom draw-methods, to be drawed
// on top of
// everything else
cam.refresh();
}
edit2
private void addWave() {
if (wave % 3 == 1) {
for (int i = 0; i < 6; i++) {
entities.add(new Monster(this, i + 1, path.getCoord(0).x,
path.getCoord(0).y - i * 57, 0.35f, Assetloader.monster01));
}
} else if (wave % 3 == 2) {
} else {
}
}
private void attack(Monster target, float damage) {
world.addEntity(new Projectile(world, vec.x, vec.y, 20, 20, target,
this, Assetloader.cursor01));
ready = false;
lastShot = System.currentTimeMillis();
}
public void addEntity(Entity e) {
this.entities.add(e);
}
【问题讨论】:
-
不是重点,但很有帮助,请阅读 THREAD LOCAL
-
如果不看一些代码,很难说发生了什么。但我认为正在发生的事情是,一个线程试图访问您的列表,而另一个线程已经在迭代该列表。所以,也许你必须使用锁来让你的线程并发访问列表。您可以尝试使用为此设计的列表接口,例如 CopyOnWriteArrayList 或 ConcurrentHashMap 。
-
请显示您的游戏循环。通常
java.util.ConcurrentModificationException发生在您在迭代时删除内容时。这并不意味着您正在从不同的线程访问内容。 -
现在添加了两个循环,你可以看到我同时迭代
-
@besplash 看,没有线程。看看:javacodegeeks.com/2011/05/… 或我的回答 ;)
标签: java multithreading arraylist