首页 > 解决方案 > 如何使用多线程来修复游戏中的 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);
        }
    }
}

标签: javamultithreading

解决方案


推荐阅读