Обновление пользовательского объекта, хранящегося в очереди приоритетов блокировки - PullRequest
1 голос
/ 01 апреля 2011

У меня есть очередь приоритетов блокировки, в которой хранятся объекты типа Message, сообщение имеет String [] data = new String [10]. Теперь мне нужно перебрать всю очередь блокировки, проверить, равен ли 2-й элемент сообщения объекта 6-му элементу входящего сообщения.

Компаратор сообщений не основан на 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);

            }
        }
    }

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Вместо прямого использования (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);

     }
}
0 голосов
/ 01 апреля 2011

Похоже, что выполнение этой операции в живой очереди несколько опасно, в зависимости от того, что ожидает нижестоящий потребитель.

Как насчет этого:

  • Когда приходит подтверждение, инициализировать новый BlockingQueue
  • Атомный обмен в новой пустой очереди на старую полную
  • Перетянуть элементы из старой очереди в новую, выполняя любые сравнения / изменения, необходимыебыть сделанным элемент за элементом

Если это часто случается, возможно, вам нужна пара очередей;один - живой;другой - тень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...