1

オブジェクトの同時リストがあります。複数のスレッドがこのリストに追加されます。ある時点で、このリストをループし、リスト要素に対して操作を実行します。リストのループ中に追加された要素を確実に処理するにはどうすればよいですか?

メインスレッド:

List<Object> someList = Collections.synchronizedList(new ArrayList<Object>());
for(Object o : someList){
    o.toString();
}

他のスレッド:

getSomeList().add(new Object());

注:リストのループを開始した後(またはその後)にオブジェクトを処理したい。

4

2 に答える 2

0

スレッド B がリストをループしている間にスレッド A に要素を追加できる唯一の方法は、スレッド B がその正確な時点でリストのコピーを作成し、そこからIteratororを取得するEnumeratorことです。ループする前にコピーを作成しないとConcurrentModificationException、他のスレッドがループしている間に別のスレッドが要素を追加した場合に取得されます。

于 2013-09-19T20:27:23.883 に答える
0

ソースリストが変更されるとすぐに反復子が無効になるため、同期された java.util.List を使用しても機能しません。生産者と消費者の問題があるようですね。キューを調べる必要があります。無制限のキューが必要な場合は java.util.Concurrent.LinkedBlockingQueue を、ブロッキング キューが必要な場合は java.util.concurrent.ArrayBlockingQueue を試してください。

于 2013-09-19T20:50:37.453 に答える