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-сообщение, получать ответ, анализировать его и извлекать часть необходимой мне информации.
Любые предложения или комментарии будут наиболее желанными.
Ответы
Ответ 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();
}
}
}