2013-04-09 76 views
0

我有下面的代码:代码产生并发修改异常

public static void pauseAllTimers() { 
     for(Timer timer : Timer.allTimers) { 
      timer.pause(); 

     } 

    } 

Timer实例被添加和删除,以allTimers一个线程内,(据我所知道的,除非我监督的东西在我的代码中)。

为什么我的代码产生并发修改异常?

回答

3

你是在你从它中删除时迭代 - 假设pause()删除了定时器。不要那样做 - 即使只有一个线程,您仍在修改集合,但仍然在迭代它,这是并发修改。

复制设置的计时器到列表中,然后遍历

List<Timer> timers = new ArrayList<Timer>(Timer.allTimers); 
for (Timer timer : timers) { 
    timer.pause(); 
} 
+0

这是有道理的,但我不删除或暂停方法的过程中添加任何实例的allTimerlist。 – 2013-04-09 19:16:37

+0

@LukeTaylor:所以当你说“在一个线程中将定时器实例添加到全部计时器并将其删除”时 - 这是怎么回事?这是你自己的'定时器'类吗? (我不记得在'java.util.Timer'上看到'allTimers'字段...) – 2013-04-09 19:20:20

+0

我很抱歉,我正在从暂停方法中的allTimerlist中删除一个实例。这是我在暂停方法中调用的另一种方法。是的,这是我自己的Timer类,它属于我写的游戏引擎。谢谢您的回答。 – 2013-04-09 19:30:31