Извиняюсь за этот повторный вопрос, но пока не нашел удовлетворительных ответов. У большинства вопросов был свой собственный конкретный случай использования:
Java - альтернатива thread.sleep
Есть ли лучший или альтернативный способ пропустить/избежать использования Thread.sleep(1000) в Java?
Мой вопрос касается очень общего варианта использования. Дождитесь завершения условия. Сделайте некоторую операцию. Проверьте состояние. Если условие не соответствует действительности, подождите некоторое время и снова выполните ту же операцию.
Например, Рассмотрим метод, который создает таблицу DynamoDB, вызывая его таблицу createAPI. В таблице DynamoDB требуется некоторое время, чтобы стать активным, чтобы метод вызывал свой API-интерфейс DescribeTable для регулярного опроса статуса через некоторое время (допустим, 5 минут - отклонение из-за планирования потоков приемлемо). Возвращает true, если таблица становится активной в течение 5 минут, и выдает исключение.
Вот псевдокод:
public void createDynamoDBTable(String name) {
//call create table API to initiate table creation
//wait for table to become active
long endTime = System.currentTimeMillis() + MAX_WAIT_TIME_FOR_TABLE_CREATE;
while(System.currentTimeMillis() < endTime) {
boolean status = //call DescribeTable API to get status;
if(status) {
//status is now true, return
return
} else {
try {
Thread.sleep(10*1000);
} catch(InterruptedException e) {
}
}
}
throw new RuntimeException("Table still not created");
}
Я понимаю, что при использовании Thread.sleep
блокирует текущий поток, тем самым потребляя ресурсы. но в приложении с довольно большим размером, это одна проблема, большая проблема?
Я где-то читал, что использую ScheduledThreadPoolExecutor
и делаю там этот статус. Но опять же, нам нужно будет инициализировать этот пул, по крайней мере, с одним потоком, где будет выполняться метод runnable для выполнения опроса.
Любые предложения о том, почему использование Thread.sleep
говорят, являются такой плохой идеей и каковы альтернативные варианты для достижения того же, что и выше.