JAVA
我的游戏中有一个ArrayList来存储游戏中的所有粒子。我有一个访问ArrayList来更新物理的更新方法,我有一个访问ArrayList的渲染方法来渲染屏幕上的粒子,还有一个MouseClick侦听器,当它检测到MouseClick时,它会向ArrayList添加一个新粒子。
我的问题是我不断收到java.util.ConcurrentModificationException。这是因为当我同时点击它渲染时,两个方法都试图访问ArrayList。是否有同时访问ArrayList的解决方案(不同的数据类型?)。
一些帮助的代码 -
ArrayList声明
ArrayList<Particle> ParticleList = new ArrayList<Particle>();
粒子类定义
public class Particle {
int x;
int y;
Color colour;
int type;
//0:wall
public Particle(int x,int y,Color colour,int type)
{
this.x = x;
this.y = y;
this.colour = colour;
this.type = type;
}`
渲染方法
for(Particle e : this.ParticleList)
{
g.fillRect(e.x, e.y, 1, 1);
}
答案 0 :(得分:5)
更新:您似乎没有多线程访问,所以我的原始答案不成立(我会为了完整性而保留)
只有在迭代过程中添加或删除集合时,才会在单个线程中出现 ConcurrentModificationException
。要解决这个问题,请创建一个新集合,该集合是第一个集合的副本,然后添加到集合中。
如果您的写入(点击)小于读取次数,则可以使用
CopyOnWriteArrayList
否则,您必须在迭代时进行同步。或者获取副本(List copy = new ArrayList(original)
)
答案 1 :(得分:2)
Swing本身是隐式单线程的。您的点击和渲染应该在同一个线程上。如果这样做,您将不会收到ConcurrentModificationException,因为您只会呈现或处理点击。