2011-04-01 56 views
1

我有一個阻塞優先級隊列,它存儲類型爲消息的對象,消息具有String [] data = new String [10]。現在我必須迭代整個阻塞隊列,檢查它的Object消息的第二個元素是否等於傳入消息的第六個元素。更新存儲在阻塞優先級隊列中的自定義對象

消息比較器不是基於需要更新的第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); 

      } 
     } 
    } 

回答

1

而不是直接在if條件下使用(Message)iter.next(),試試這個。

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

    } 
} 
0

看起來在活隊列上執行此操作有點危險,這取決於下游消費者的期望。

如何:

  • 當ACK到來時,初始化的新的空隊列中的新BlockingQueue
  • 原子交換舊滿滿一
  • 從舊的隊列瀝乾元素到新的一個,做任何比較/變化需要作出元素

如果這發生了很多,也許你需要一對隊列;一個是活的;另一個是影子。