Код, над которым я работаю, вызывает вышеупомянутое исключение. Я не очень разбираюсь в многопоточном программировании, и мне не очень повезло в устранении неполадок.
Программа написана на Java с использованием Processing и OSC. Основной обработчик событий OSC добавляет элементы в вектор. Он срабатывает при вводе данных пользователем и поэтому крайне непредсказуем. Этот вектор также повторяется и обновляется в потоке анимации Processing, который происходит очень регулярно, примерно 60 раз в секунду.
Иногда обработчик событий OSC вызывается, когда вектор повторяется в потоке анимации, и генерируется исключение.
Я попытался добавить модификатор "synchronized
" в обработчик событий OSC. Я также попытался внести изменения в вектор до следующего кадра (шага времени) потока анимации, но я обнаружил, что это просто приводит к задержке выдачи исключения.
Что я могу сделать, чтобы предотвратить такое поведение? Есть ли способ получить доступ к Вектору только в том случае, если он еще не используется?
Обновление: два ответа предполагают, что в список добавляются или удаляются элементы по мере его повторения. На самом деле это происходит из-за того, что OSC запускает обработчик из потока, отличного от потока, который выполняет итерацию по списку. Я ищу способ предотвратить это.
Вот некоторый псевдокод:
Vector<String> list = new Vector<String>();
Vector<Particle> completedParticles = new Vector<Particle>();
public void oscEvent( OSCMessage message )
{
list.add( new Particle( message.x, message.y ) );
}
public void draw()
{
completedParticles.clear();
for( Particle p : list )
{
p.draw();
if( p.isComplete ) {
completedParticles.add( p );
}
}
list.removeAll( completedParticles );
}
syncrhonized
или используяsynchronized(list)
. - person Edwin Dalorzo   schedule 04.07.2012