Выполнять только один раз в цикле - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть метод, чтобы добавить объекты в очередь, а также проверить размер очереди.Если размер очереди достигает максимальной емкости, будет подан сигнал тревоги, и очередь удалит первый объект.Ниже приведен код

private SomeQueue queue;
private boolean raiseAlarmOnce = true;
private boolean alarmRaised;
private AlarmConnection alarmConnection;

void addToQueue(Object obj) {

     queue.add(obj);

     while (queue.size() > 1000) {
         queue.remove(); 

         if (m_raiseAlarmOnce) {
            // raiseAlarm mtheod will return boolean value to indicate 
            // the result of raising alarm
            m_alarmRaised = alarmConnection.raiseAlarm();
            raiseAlarmOnce = false;
         }
      }
      m_raiseAlarmOnce = true;

      if (m_alarmRaised) {
         alarmConnection.clear();
         m_alarmRaised = false;
      }
   }

Если размер очереди больше 1000, очередь будет непрерывно удалять объект и поднимать сигнал тревоги только один раз.Если тревога сработала успешно, она будет удаленаПросто хотите узнать какой-нибудь лучший способ сделать это?

1 Ответ

0 голосов
/ 19 февраля 2019

если вам нужно поднять тревогу один раз, когда размер очереди равен 1001, 1002 и т. Д. Вместо одного раза для каждой итерации, поднимите тревогу время от времени, используя флаг

Я предлагаю использовать локальные переменные при работе с потокамиили синглтоны isntances

void addToQueue(Object obj) {

     queue.add(obj)
     boolean raisAlarm = false;

     while (queue.size() > 1000) {
         queue.remove(); 
         raisAlarm  = true;
      }


      if (raisAlarm) {
            // raiseAlarm mtheod will return boolean value to indicate 
            // the result of raising alarm
            boolean m_alarmRaised = alarmConnection.raiseAlarm();
            if (m_alarmRaised) {
              alarmConnection.clear();
            }
     }
}
...