有时接收java.util.ConcurrentModificationException,有时不接收。Can';我不明白为什么 因此,首先是错误消息:
线程“thread-2”中的异常有时接收java.util.ConcurrentModificationException,有时不接收。Can';我不明白为什么 因此,首先是错误消息:,java,crash,render,Java,Crash,Render,线程“thread-2”中的异常 java.util.ConcurrentModificationException 在java.util.ArrayList$Itr.checkForComodification(未知源) 在java.util.ArrayList$Itr.next(未知源代码) 在zom.mainpac.Game.render(Game.java:218) 在zom.mainpac.Game.run(Game.java:154) 在java.lang.Thread.run(未知
java.util.ConcurrentModificationException
在java.util.ArrayList$Itr.checkForComodification(未知源)
在java.util.ArrayList$Itr.next(未知源代码)
在zom.mainpac.Game.render(Game.java:218)
在zom.mainpac.Game.run(Game.java:154)
在java.lang.Thread.run(未知源)
在第218行渲染对象的阵列列表:
for(Objects e : list){
e.render(g);
}
然后是第154行的渲染函数:
render();
问题可能是因为我的笔记本电脑有时无法渲染所有对象,所以放弃了。因此,我只是想知道是否有更好的方法可以做到这一点,而不会一直崩溃。您有线程安全问题和/或列表访问问题。您可能希望将列表/数组项复制到本地变量中,因此在遍历和/或考虑同步块时不能修改列表。
一个线程正在访问您的实例列表变量(执行for循环),然后另一个线程出现,可能它想要访问它。要解决而不是使用实例变量执行for循环,请创建一个局部变量并从.list中复制项。现在您有了一个其他线程无法访问的私有列表您有了线程安全问题和/或列表访问问题。您可能希望将列表/数组项复制到本地变量中,因此在遍历和/或考虑同步块时不能修改列表。
一个线程正在访问您的实例列表变量(执行for循环),然后另一个线程出现,可能它想要访问它。要解决而不是使用实例变量执行for循环,请创建一个局部变量并从.list中复制项。现在您有了一个其他线程无法访问的私有列表您有了线程安全问题和/或列表访问问题。您可能希望将列表/数组项复制到本地变量中,因此在遍历和/或考虑同步块时不能修改列表。
一个线程正在访问您的实例列表变量(执行for循环),然后另一个线程出现,可能它想要访问它。要解决而不是使用实例变量执行for循环,请创建一个局部变量并从.list中复制项。现在您有了一个其他线程无法访问的私有列表您有了线程安全问题和/或列表访问问题。您可能希望将列表/数组项复制到本地变量中,因此在遍历和/或考虑同步块时不能修改列表。
一个线程正在访问您的实例列表变量(执行for循环),然后另一个线程出现,可能它想要访问它。要解决而不是使用实例变量执行for循环,请创建一个局部变量并从.list中复制项。现在您有了一个私有列表,其他线程无法访问该列表。For each使用迭代器执行循环,因此,如果您碰巧从该列表中删除了某些内容,则在迭代过程中很容易出现此类异常。例如,如果在渲染时从游戏中的列表中删除平铺或精灵,可能会发生这种情况。如果您不经常修改列表,那么如果您希望在迭代时修改列表,您可以使用CopyOnWriteArrayList(我们不必创建列表的副本),但需要注意的是,您应该首先了解导致此情况的行为,而不是使用盲修复。For each使用迭代器进行循环,所以,若您碰巧从列表中删除了一些内容,那个么在迭代过程中很容易出现这种异常。例如,如果在渲染时从游戏中的列表中删除平铺或精灵,可能会发生这种情况。如果您不经常修改列表,那么如果您希望在迭代时修改列表,您可以使用CopyOnWriteArrayList(我们不必创建列表的副本),但需要注意的是,您应该首先了解导致此情况的行为,而不是使用盲修复。For each使用迭代器进行循环,所以,若您碰巧从列表中删除了一些内容,那个么在迭代过程中很容易出现这种异常。例如,如果在渲染时从游戏中的列表中删除平铺或精灵,可能会发生这种情况。如果您不经常修改列表,那么如果您希望在迭代时修改列表,您可以使用CopyOnWriteArrayList(我们不必创建列表的副本),但需要注意的是,您应该首先了解导致此情况的行为,而不是使用盲修复。For each使用迭代器进行循环,所以,若您碰巧从列表中删除了一些内容,那个么在迭代过程中很容易出现这种异常。例如,如果在渲染时从游戏中的列表中删除平铺或精灵,可能会发生这种情况。如果您不经常修改列表,如果您希望在迭代时修改列表,则可以使用CopyOnWriteArrayList(让我们不必创建列表的副本),但需要注意的是,您应该首先了解导致此问题的行为,而不是使用盲修复。出现问题的原因是您的代码在迭代时修改了列表
- 如果只有一个线程从列表中读/写,那么调用 这一战略(2)
for (Objects e : new ArrayList(list)) {
e.render(g);
}
- 如果有多个线程来读/写列表,请改用java.util.concurrent.CopyOnWriteArrayList
-
for (Objects e : new ArrayList(list)) { e.render(g); }