1

我有一个阻塞优先级队列,它存储消息类型的对象,消息具有字符串 [] 数据 = 新字符串 [10]。现在我必须遍历整个阻塞队列,检查它的对象消息的第二个元素是否等于传入消息的第六个元素。

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
  • 在新的空队列中原子交换旧的完整队列
  • 将旧队列中的元素排入新队列,逐个元素地进行任何比较/更改

如果这种情况经常发生,也许你需要一对队列;一个是活的;另一个是影子。

于 2011-04-01T04:07:03.023 回答