更新存储在阻塞优先级队列中的自定义对象

时间:2011-04-01 03:57:28

标签: java blockingqueue

我有一个阻塞优先级队列,它存储Message类型的对象,消息有String [] data = new String [10]。现在我必须迭代整个阻塞队列,检查它的Object消息的第二个元素是否等于传入消息的第6个元素。

Messages的比较器不是基于需要更新的第6个元素。问题是,如果我取出一个对象,然后如何将它放在相同的位置,如果我使用下面的代码更新它,那么无论何时运行iter.next(),它都可能开始指向下一个Object。

这是我正在尝试的。

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);

            }
        }
    }

2 个答案:

答案 0 :(得分: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);

     }
}

答案 1 :(得分:0)

看起来在实时队列上执行此操作有点危险,具体取决于下游消费者期望的内容。

这个怎么样:

  • 当ack进来时,请初始化新的BlockingQueue
  • 旧的完整队列的新空队列中的原子交换
  • 将旧队列中的元素排放到新队列中,使得需要逐元素地进行比较/更改

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