1

タイプ Message のオブジェクトを格納するブロッキング プライオリティ キューがあります。メッセージには String[] data = new String[10] があります。ここで、ブロッキング キュー全体を反復する必要があります。そのオブジェクト メッセージの 2 番目の要素が着信メッセージの 6 番目の要素と等しいかどうかを確認します。

Messages のコンパレータは、更新が必要な 6 番目の要素に基づいていません。問題は、オブジェクトを取り出して同じ位置に配置する方法と、以下のコードを使用して更新すると、 iter.next() が実行されるたびに次のオブジェクトを指し始める可能性があることです。

これが私が試みていることです。

public synchronized void updateAck(Message ackMessage)
    {
        Iterator iter  = localQ.iterator(); // localQ is the blocking priority queue here
        while(iter.hasNext())
        {
            if(((Message)iter.next()).data[2].equalsIgnoreCase(ackMessage.data[6]))
            {
                (Integer.parseInt((Message)iter.next()).data[6])+1);

            }
        }
    }
4

2 に答える 2

1

(Message)iter.next()条件で直接使用する代わりにif、これを試してください。

Message queMessage = (Message)iter.next();

完全なコード

 while(iter.hasNext())
{

    Message queMessage = (Message)iter.next(); //you will be invoking .next() only once

     if(queMessage.data[2].equalsIgnoreCase(ackMessage.data[6]))
     {
          (Integer.parseInt(queMessage.data[6])+1);

     }
}
于 2011-04-01T05:01:44.437 に答える
0

ライブ キューでこの操作を行うことは、下流の消費者が何を期待しているかによっては、やや危険なようです。

これはどう:

  • ack が来たら、新しいBlockingQueue
  • 古い満杯の新しい空のキューのアトミック スワップ
  • 古いキューから新しいキューに要素を排出し、要素ごとに必要な比較/変更を行います

これが頻繁に発生する場合は、キューのペアが必要になる可能性があります。1つはライブのものです。もう一つは影です。

于 2011-04-01T04:07:03.023 に答える