0

私は、ネットワーク上でプレイするマルチプレイヤー スネーク ゲームを開発しています。正常に動作していますが、時々 java.util.ConcurrentModification Exception をスローします。これは私のゲームのメイン クラスの paintComponent() メソッドでスローされます。これがスローされるコードは

 for (String name : map.keySet()) {
        if (!map.get(name).gameover) {
            for (int i = 0; i < map.get(name).length; i++) {
                rect = new Rectangle2D.Double(map.get(name).p[i].x,
                        map.get(name).p[i].y, width, width);
                g1.setColor(Color.black);
                g1.draw(rect);
                g1.setPaint(map.get(name).snakecolor);
                g1.fill(rect);
            }
        }
    }

Hashmap マップは、からのマッピングです。

        HashMap<String,Snake> 

Snake は、ヘビのすべての属性を持つクラスです。また、メイン クラスは、サーバーを介して他のクライアントからメッセージと更新を受信するために、スレッドを並行して実行します。

スレッド側の反復子も同じマップを使用します (そのクラスへの参照によって渡されます)。そのためのコードは以下のとおりです。この関数は、プレーヤーのスコアが特定のポイントに達した後、レベルがアップグレードされた場合に呼び出されます。

    void levelUp(int level){
    for(String name:map.keySet()){
        map.get(name).level=level;
    }
    Game.speed=100/level;
}

オブジェクト書き込みの衝突はこれによるものだと思います。誰でもこの問題の解決策を提案できますか。

値をマップに入れるコードも以下に示します。

void populateMap() {
    try {
        try {
            objin = new ObjectInputStream(socket.getInputStream());
        } catch (StreamCorruptedException e) {
            System.out.println("Stream Corrupted!");
        }
        Object name = objin.readObject();
        if (((Snake) name).player.equals("food_coord")) {
            Game.foodx = objin.readInt();
            Game.foody = objin.readInt() + 35;
            start = true;
            System.out.println("Game Started");
            return;
        } else {
            map.put(((Snake) name).player, (Snake) name);
            System.out.println("Recieved: " + ((Snake) name).player);
        }
    } catch (java.net.SocketException s) {
        JOptionPane.showMessageDialog(null, "Server Closed", "ERROR",
                JOptionPane.ERROR_MESSAGE);
        System.exit(0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4

1 に答える 1

1

マップの実装クラスを次のような同時実行をサポートするクラスに変更します。ConcurrentHashMap

于 2013-04-13T09:01:58.090 に答える