gpt4 book ai didi

java - 在 2 个不同的线程中写入和读取 ArrayList

转载 作者:行者123 更新时间:2023-11-30 09:07:45 26 4
gpt4 key购买 nike

我目前正在为学校做一个小项目,这是一款 TowerDefense 游戏。

初始化游戏时,它会启动一个计算所有内容的线程。启动该线程后,我的代码跳入一个循环,循环我的图形代码。我认为它当时正在使用 2 个线程。一个线程用于计算,另一个是“标准”线程,在您打开程序本身时使用。

现在我想将射弹添加到我的塔中。为此,我需要向我的实体 ArrayList 添加一个新的射弹对象。每当我尝试这样做时,它都会说

线程“main”中的异常 java.util.ConcurrentModificationException

并指向我的 graphicsloop 所在的行,它试图循环我的实体数组。这是有道理的,因为我的 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);
}

最佳答案

当需要在多个线程中收集数据时,应该使用支持并发的结构。在 Java 中,此类类可以在 java.util.concurrent 中找到。包裹。对于您的情况,您应该使用 CopyOnWriteArrayList类而不是 ArrayList

根据我的经验,使用 ArrayListArrayList 的并发支持变体并不是这些情况的最佳选择。最好使用像 ConcurrentLinkedQueue 这样的并发队列.

关于java - 在 2 个不同的线程中写入和读取 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23872559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com