java - 如何使用多线程来修复游戏中的 ConcurrentModificationExceptions 以进行移动和精灵创建?
问题描述
我正在尝试使用线程创建一个游戏来创建精灵和移动——但是,有时我几乎无法运行它,因为我不断收到 ConcurrentModificationExceptions。我想知道是否有人可以帮助我弄清楚如何使这些错误不再经常发生。
我尝试将“同步”添加到正在更新沿线程运行的对象并使用迭代器的方法中,但无济于事。以下是我使用线程的所有功能:
我的大部分错误都发生在最后一个“update”方法或“updateScene”方法中。
public class ProjectileLauncher implements Runnable {
private Model model;
private View view;
public ProjectileLauncher(Model model, View view) {
this.model = model;
this.view = view;
}
@Override
public synchronized void run() {
if (!(model.getHero().isNotDead())) {
System.out.println("You lose!");
}
while (model.getGameNotPaused()) {
model.updateScene(view.getWidth(), view.getHeight());
view.repaint();
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
JOptionPane.showMessageDialog(null, "Press R to resume game.");
}
}
}
}
public synchronized void updateScene(int width, int height) {
Iterator<Sprite> iterator = sprites.iterator();
if (hero.isNotDead()) {
while (iterator.hasNext()) {
Sprite spriteObject = iterator.next();
if (spriteObject instanceof Fireball) {
((Fireball) spriteObject).updateState();
/*
if (spriteObject.overlaps(hero, 100, 135)) {
hero.fireballHit();
iterator.remove();
}
*/
} if (spriteObject instanceof Arrow) {
((Arrow) spriteObject).updateState();
if (spriteObject.overlaps(dragon, 350, 350)) {
dragon.arrowHit();
}
}
}
}
}
public synchronized void update(Graphics g) {
Iterator<Sprite> iterator = sprites.iterator();
while (iterator.hasNext()) {
iterator.next().updateImage(g);
}
}
}
解决方案
推荐阅读
- ajax - Ajax - 解析 oData 响应
- mongodb - Mongoose:使用 $or 进行跨多个字段的部分匹配
- python - 按下按钮时将 var +1 添加到标签(kivy)
- graph - 在 O(V+E) 中找到图中的瓶颈边缘
- php - 有没有比 ob_get_contents(); 更好的方法来更改标题和元标记?
- node.js - 在反应项目上运行 NPM 启动后出错
- javascript - javascript 字符串数组到 json 对象
- xml - 在 XSD 中,如何在元素的内容中只允许空格?
- r - 数据集 R 消除了相关性均值为 0 的列
- javascript - 静音 YouTube 视频和自动播放