Thread.sleep () в цикле while - PullRequest
       35

Thread.sleep () в цикле while

21 голосов
/ 09 января 2012

Я заметил, что NetBeans предупреждает меня об использовании Thread.sleep () в цикле while в моем Java-коде, поэтому я провел небольшое исследование по этому вопросу.Похоже, что в первую очередь проблема связана с производительностью, когда ваше условие while может стать истинным, пока счетчик все еще спит, тратя таким образом время настенных часов на ожидание следующей итерации.Все это имеет смысл.

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

String state = get state via RPC call
while (!state.equals("complete")) {
    Thread.sleep(10000); // Wait 10 seconds
    state = {update state via RPC call}
}

Учитывая, что обстоятельства проверяют удаленную операцию (это довольно дорогой процесс, поскольку он выполняется в течение нескольких секунд), является ли это допустимым использованиемThread.sleep () во время цикла?Есть ли лучший способ структурировать эту логику?Я видел несколько примеров, где я мог бы использовать класс Timer, но я не вижу преимущества, так как он все еще, кажется, сводится к той же простой логике выше, но с гораздо большей сложностью.

Имейте в виду, что удаленная система в этом случае не находится под моим непосредственным контролем и не написана на Java, поэтому изменение этого конца на более «совместное» в этом сценарии не вариант.Единственный вариант для обновления значения моего приложения для состояния - это создание и отправка сообщения XML, получение ответа, анализ его, а затем извлечение необходимой информации.

Любые предложения или комментарии приветствуются..

Ответы [ 3 ]

13 голосов
/ 09 января 2012

Если ваша удаленная система не может выдать событие или иным образом уведомить вас асинхронно, я не думаю, что вышеупомянутое вообще необоснованно. Вам нужно сбалансировать ваше sleep() время с временем / нагрузкой, которое вызывает вызов RPC, но я думаю, что это единственная проблема, и вышеупомянутое не выглядит проблемой вообще.

4 голосов
/ 09 января 2012

Не имея возможности изменить удаленный конец, чтобы выдать «push» уведомление о том, что это делается с помощью его длительного процесса, это примерно так же, как вы собираетесь это сделать. Пока время Thread.sleep по сравнению со стоимостью опроса велико, с вами все будет в порядке.

0 голосов
/ 10 января 2012

Вы не должны (почти) никогда не использовать сон, поскольку он очень неэффективен и не является хорошей практикой.Всегда используйте блокировки и условные переменные, где потоки сигнализируют друг другу.См. Стандарты кодирования для программирования с потоками

Майка Далина. Шаблон:

public class Foo{
  private Lock lock;
  private Condition c1;
  private Condition c2;

  public Foo()
  {
    lock = new SimpleLock();
    c1 = lock.newCondition();
    c2 = lock.newCondition();
    ...
  }

  public void doIt()
  {
    try{
      lock.lock();
      ...
      while(...){
        c1.awaitUninterruptibly();
      }
      ...
      c2.signal();
    }
    finally{
      lock.unlock();
    }
  }
}
...