1

特定の時間間隔で実行され、リスト内の各項目を処理するスレッド内CopyOnWriteArrayListのメソッドによって反復される を使用する Java プログラムがあります。update()リスト内のアイテムはスレッドセーフではないため、変更するアイテムと、メソッドがリストを反復処理するCopyOnWriteArrayListタイミングを知るために使用されるさまざまなバッファーを使用して、アイテムの変更を処理しています。update()

問題は、これらのバッファーを使用した後、clear()それらを使用したことですが、バッファーが使用されてからクリアされるまでの間にアイテムがバッファーに追加された可能性があることです。

例えば:

mainList.addAll(bufferAddList);
bufferAddList.clear(); 

例 2:

for (Item item : mainList) { // Main iterator loop
    if (bufferModItemList.contains(item)) {
        item.modify();
    }
    // Do other stuff
}
bufferModItemList.clear();

synchronizeこれらのリストを読み取り/変更するコードブロックの周りを使用すると、メインスレッドがロックアップする原因になるのではないかと心配しています (変更の呼び出し元)。アイテムの反復中に発生する処理にはしばらく時間がかかるためです (Pythonスクリプトが呼び出されて待機します)。それが、そもそもバッファを使用している理由です。

私が言及した方法のいずれかよりもこれを行うためのより良い方法はありますか?

update()どちらの例も、スレッドの「無限」while ループにあるメソッドで実行されるコードを示していることに注意してください。

アップデート

を使用ConcurrentLinkedQueueすると、例 2 の問題が解決されるようです。しかし、基本的にはすべてのノードをmainList. ConcurrentLinkedQueueメソッドがあれば最高です.pollAll()

また、次の例では、アイテムを から繰り返し削除するmainList必要がありますが、これはCopyOnWriteArrayList. もう1つにする必要があるかどうかはわかりませんが...

例 3:

mainList.removeAll(bufferRemoveList);
bufferRemoveList.clear(); 
4

0 に答える 0