Можно ли использовать Thread.sleep() в цикле в Java, чтобы что-то делать с регулярными интервалами?
Я прочитал несколько потоков, в которых говорилось, что вызов Thread.sleep() в цикле является проблематичным и является серьезной проблемой производительности. Но в некоторых случаях это кажется наиболее естественным делом.
Например, если я хочу, чтобы мое приложение выполняло что-то каждые 3 минуты (скажем, автосохранение)
public void startAutosaveLoop(){
stop = false;
new Thread(new Runnable() {
@Override
public void run() {
while (!stop){
Thread.sleep(T*1000);
if (!stop){
// do something
}
}
}
}).start();
}
Есть ли лучший способ сделать это? Является ли такая ситуация проблематичной?
Ответы
Ответ 1
Если вы спите в течение длительного времени, это не повлияет на производительность. Если вы спите в течение 5 мс, проверьте состояние, вернитесь в режим ожидания на 5 мс и т.д. В течение 3 минут он будет иметь некоторую производительность.
Если вам нужно что-то делать каждые 3 минуты, было бы разумнее использовать планировщик.
Вы можете взглянуть на javadoc ScheduledExecutorService для очень похожего примера.
Ответ 2
Вам следует использовать ScheduledExecutorService, если вы хотите установить задержку. Этот интерфейс поддерживает будущее и/или периодическое выполнение задачи.
Pls check API doc для примера кода и деталей:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html