私が取り組んでいるコードは、前述の例外をスローしています。私はマルチスレッド プログラミングの経験があまりなく、これをトラブルシューティングする運があまりありません。
このプログラムは、Processing と OSC を使用して Java で記述されています。メインの OSC イベント ハンドラーは、ベクターに要素を追加しています。これはユーザー入力でトリガーされるため、非常に予測不可能です。このベクターは、Processing のアニメーション スレッドでも繰り返し処理され、更新されます。これは、1 秒あたり約 60 回の頻度で非常に定期的に発生します。
ベクターがアニメーション スレッドで反復処理されているときに OSC イベント ハンドラーが呼び出され、例外がスローされることがあります。
synchronized
OSC イベント ハンドラに" " 修飾子を追加しようとしました。また、アニメーション スレッドの次のフレーム (時間ステップ) まで Vector への変更をキューに入れようとしましたが、例外がスローされるのを遅らせるだけであることがわかりました。
この動作を防ぐにはどうすればよいですか? ベクターがまだ使用されていない場合にのみアクセスする方法はありますか?
更新: 2 つの回答は、反復処理中にリストに要素が追加または削除されていることを示唆しています。これは、リストを繰り返し処理しているスレッド以外のスレッドから 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 );
}