【发布时间】:2015-08-13 22:13:36
【问题描述】:
我是 Java 新手,我目前正在制作这个玩家必须吃一些饼干的游戏。这些 cookie 是 ArrayList 的元素。此 ArrayList 由两个线程修改: - 使用 Iterator.remove() 对其进行迭代并删除已吃掉的 cookie - 每 5 秒向 ArrayList 添加一个 cookie
有时我得到一个 ConcurrentModificationException,我知道这是因为 Iterator.remove() 的行为“如果在迭代过程中以任何其他方式修改基础集合,则未指定”,如 Java 教程中所述太阳。我应该怎么做?
编辑:更新代码
List<Cupcake> cake = Collections.synchronizedList(new ArrayList<Cupcake>());
这是生成器:
public class CupcakeSpawner extends Thread {
private Background back;
public CupcakeSpawner(Background back) {
this.back = back;
}
public void run() {
while(true) {
if(back.getCake().size() < 15)
back.getCake().add(new Cupcake());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
我的更新方法:
public void update() {
List<Cupcake> cake = back.getCake();
Iterator<Cupcake> itrC = cake.iterator();
while(itrC.hasNext()) {
Cupcake cupcake = (Cupcake)(itrC.next());
checkCollisionCup(cupcake);
if(cupcake.isEaten())
itrC.remove();
}
}
}
【问题讨论】:
-
你不需要使用 Iterator#next 进行投射:Cupcake cupcake = itrC.next();
-
另外我不确定你是否需要另一个线程来处理 15 个蛋糕。
标签: java arraylist concurrentmodification