我正在努力将此问题排序在我运行的游戏循环中。
我在Update()过程中有以下一个帖子:
ListIterator<ExplosionClass> litr = Explosions.listIterator();
while(litr.hasNext()){
ExplosionClass element = (ExplosionClass) litr.next();
if (element.FinishedExplosion) {
litr.remove();
}
}
&#13;
我在litr.next();
上间歇性地得到一个ConcurrentModificationException我正在通过另一个程序不时向Explosions列表中添加新项目。
第二个帖子的My Game循环如下:
public void run() {
Canvas canvas;
Log.d(TAG, "Starting game loop");
long beginTime; // the time when the cycle begun
long timeDiff; // the time it took for the cycle to execute
int sleepTime; // ms to sleep (<0 if we're behind)
int framesSkipped; // number of frames being skipped
sleepTime = 0;
// render state to the screen
// draws the canvas on the panel
while (running) {
//while (!paused && running) {
canvas = null;
synchronized (this) {
while (isPaused) {
try {
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
this.gamePanel.render(canvas);
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
this.wait();
} catch (InterruptedException e) {
}
}
}
// try locking the canvas for exclusive pixel editing
// in the surface
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
beginTime = System.currentTimeMillis();
framesSkipped = 0; // resetting the frames skipped
// update game state
if (!isPaused && running) this.gamePanel.update();
// render state to the screen
// draws the canvas on the panel
if (!isPaused) this.gamePanel.render(canvas);
// calculate how long did the cycle take
timeDiff = System.currentTimeMillis() - beginTime;
// calculate sleep time
sleepTime = (int)(FRAME_PERIOD - timeDiff);
if (sleepTime > 0) {
// if sleepTime > 0 we're OK
try {
// send the thread to sleep for a short period
// very useful for battery saving
Thread.sleep(sleepTime);
} catch (InterruptedException e) {}
}
while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
// we need to catch up
// update without rendering
if (!isPaused && running) this.gamePanel.update();
// add frame period to check if in next frame
sleepTime += FRAME_PERIOD;
framesSkipped++;
}
}
} finally {
// in case of an exception the surface is not left in
// an inconsistent state
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
} // end finally
}
try {
Thread.sleep(FRAME_PERIOD);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//}
}
&#13;
答案 0 :(得分:0)
实际上,你不能这样做:你必须确保其他线程在使用迭代器迭代时使用synchronized或其他锁定机制来更改列表。
答案 1 :(得分:0)
问题是,如果两个迭代器同时修改Collection的内部结构会导致ConcurrentModification异常。要处理此问题,请使用同步集合(CopyOnWriteArrayList)
答案 2 :(得分:0)
当您在列表上调用迭代器时,在迭代器正在工作时无法修改它。