我正在开发一种通过网络播放的多人蛇游戏。 它运行正常,但偶尔会抛出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();
}
}
答案 0 :(得分:1)
将地图实现类更改为支持并发性的类,例如ConcurrentHashMap