Подтвердить что ты не робот

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

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

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

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() в цикле while? Есть ли лучший способ структурировать эту логику? Я видел несколько примеров, где я мог бы использовать класс Timer, но я не вижу преимущества, поскольку он все еще, похоже, сводится к одной и той же простой логике выше, но с гораздо большей сложностью.

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Шаблон:

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