我在以下代码中收到ConcurrentModificationException:
private static List<Task> tasks = new LinkedList<Task>();
...
public void doTasks(){
synchronized(tasks){
Iterator<Task> it = tasks.iterator();
while(it.hasNext()){
Task t = it.next(); < Exception is always thrown on this line.
if(t.isDone()){
it.remove();
} else {
t.run();
}
}
}
}
...
public void addTask(Task t){
synchronized(tasks){
tasks.add(t);
}
}
...
public void clearTasks(){
synchronized(tasks){
tasks.clear();
}
}
对象“任务”不会在类中的任何其他位置使用。我不知道为什么我会得到例外。任何帮助将不胜感激。
答案 0 :(得分:3)
这是你的问题:
if(t.isDone()){
...
} else {
t.run(); // probably changing the task, so consequently the list tasks
}
编辑:您无法更改循环中的tasks
列表。查看ConcurrentModificationException
documentation了解更多详情。
干杯!
答案 1 :(得分:1)
发现错误!我忘记了在doTask()中运行任务的场景实际上可以调用addTask()。但是我有点困惑,为什么会发生这种情况,因为我认为“任务”对象会被doTask()函数锁定。