Я пишу небольшую игру, в которой много движущихся по экрану кругов.
Я управляю кругами в двух потоках следующим образом:
public void run() {
int stepCount = 0;
int dx;
int dy;
while (m_threadTrap){
dx = 0;
dy = 0;
synchronized (m_circles) {
for (Iterator<Circle> it = m_circles.iterator(); it.hasNext();){
Circle c = it.next(); //Exception thrown here.
if (c.getDirX() != 0)
if (stepCount % c.getDirX() == 0){
dx = 1;
}
if (c.getDirY() != 0)
if (stepCount % c.getDirY() == 0){
dy = 1;
}
c.move(dx, dy);
}
}
if (stepCount == 150000){
stepCount = 0;
}
stepCount++;
}
}
m_circles в ArrayList of Circles.
И следующая тема:
public void run() {
while (m_threadTrap){
int topPosition;
int bottomPosition;
int leftPosition;
int rightPosition;
ArrayList<Circle> removedCircles = new ArrayList<Circle>();
synchronized (m_circles.getCircles()) {
for (Iterator<Circle> it = m_circles.getCircles().iterator(); it.hasNext();){
Circle c = it.next();
// Some calculation to evaluate which circles should be removed
removedCircles.add(c);
}
}
}
try{
Thread.sleep(25);
}
catch (Exception e) { }
m_circles.getCircles().removeAll(removedCircles);
if (m_circles.getCircles().size() < 30)
m_circles.addNewCircle();
repaint();
}
}
Моя проблема в том, что я получаю исключение ConcurrentModificationException в строке
Circle c = it.next();
в первой теме. Сначала я попытался просмотреть ArrayList с помощью цикла foreach, и это дало мне то же исключение.
После небольшого исследования этого исключения я увидел два решения:
1. Поместить деталь, которая обращается к коллекции, в синхронизированный блок.
2. Использование объекта-итератора коллекции.
Никто из них не решил это за меня.