我正在处理的代码正在引发上述异常。我对多线程编程不是很有经验,而且我没有很多运气来解决这个问题。
该程序是使用处理和 OSC 用 Java 编写的。主要的 OSC 事件处理程序正在向 Vector 添加元素。它是在用户输入时触发的,因此高度不可预测。这个向量也在 Processing 的动画线程中被迭代和更新,它以每秒大约 60 次的速度非常有规律地发生。
有时,当 Vector 在动画线程中被迭代并抛出异常时,会调用 OSC 事件处理程序。
我尝试将“ synchronized
”修饰符添加到 OSC 事件处理程序。我还尝试在动画线程的下一帧(时间步)之前提示对 Vector 的更改,但我发现它最终只是延迟了抛出的异常。
我能做些什么来防止这种行为?如果 Vector 尚未使用,有没有办法只访问它?
更新: 两个答案表明列表在迭代时添加或删除了元素。这实际上是由于 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 );
}