Способ использовать ArrayList без ConcurrentModificationException (s)? - PullRequest
1 голос
/ 01 мая 2011

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);
}

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Обновление: кажется, что у вас нет многопоточного доступа, поэтому мой оригинальный ответ не сохраняется (я буду держать его для полноты)

ConcurrentModificationException в одном потоке происходит, только еслиВы добавляете или удаляете из коллекции, пока она повторяется.Чтобы это исправить, создайте новую коллекцию, которая является копией первой, и добавьте к ней вместо этого.


Если количество записей (кликов) намного меньше количества операций чтения, то вы можете использоватьCopyOnWriteArrayList

В противном случае вам придется синхронизироваться при итерации.Или получите копию (List copy = new ArrayList(original))

2 голосов
/ 01 мая 2011

Сам Swing неявно однопоточный.Ваши клики и ваш рендеринг должны быть в одной теме.Если вы сделаете это, вы не получите ConcurrentModificationException, потому что вы будете только обрабатывать или обрабатывать клики.

...