Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代码生成并发修改异常_Java_Android_Concurrency - Fatal编程技术网

Java 代码生成并发修改异常

Java 代码生成并发修改异常,java,android,concurrency,Java,Android,Concurrency,我有以下代码: public static void pauseAllTimers() { for(Timer timer : Timer.allTimers) { timer.pause(); } } 其中,Timer实例在一个线程内被添加和删除到allTimers(据我所知,除非我在监督代码中的某些内容) 为什么我的代码会产生并发修改异常?在从集合中删除时,您正在对集合进行迭代-假设pause()删除了计时器。不要这样做-

我有以下代码:

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

        }

    }
其中,
Timer
实例在一个线程内被添加和删除到
allTimers
(据我所知,除非我在监督代码中的某些内容)

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

在从集合中删除时,您正在对集合进行迭代-假设
pause()
删除了计时器。不要这样做-您在修改集合的同时仍在对其进行迭代,这是一种并发修改,即使只有一个线程

将计时器集复制到列表中,然后迭代:

List timers=new ArrayList(Timer.allTimers);
用于(计时器:计时器){
timer.pause();
}
当从集合中删除时,您正在对集合进行迭代-假设
pause()
删除了计时器。不要这样做-您在修改集合的同时仍在对其进行迭代,这是一种并发修改,即使只有一个线程

将计时器集复制到列表中,然后迭代:

List timers=new ArrayList(Timer.allTimers);
用于(计时器:计时器){
timer.pause();
}

这是有道理的,但是在暂停方法期间,我没有删除或添加任何实例到allTimerlist。@LukeTaylor:那么当你说“在一个线程中向AllTimer添加和删除计时器实例的位置”时,是怎么做的?这是你自己的
Timer
课程吗?(我不记得在
java.util.Timer
上看到过
allTimers
字段)很抱歉,我正在从pause方法的allTimerlist中删除一个实例。这是我在pause方法中调用的另一个方法。是的,这是我自己的定时器类,属于我正在编写的游戏引擎。谢谢你的回答。这是有道理的,但是在暂停方法期间,我不会删除或添加任何实例到allTimerlist。@LukeTaylor:那么当你说“在一个线程中向AllTimer添加和删除计时器实例的位置”-这是怎么做的?这是你自己的
Timer
课程吗?(我不记得在
java.util.Timer
上看到过
allTimers
字段)很抱歉,我正在从pause方法的allTimerlist中删除一个实例。这是我在pause方法中调用的另一个方法。是的,这是我自己的定时器类,属于我正在编写的游戏引擎。谢谢你的回答。
List<Timer> timers = new ArrayList<Timer>(Timer.allTimers);
for (Timer timer : timers) {
    timer.pause();
}