2010-09-22 4 views
0

У меня есть требование запустить цикл while 5 мин. Я искал таймер api, но я не мог этого сделать. Может ли кто-нибудь предоставить для этого код-снайпер.
Ходовая петля в течение 5 минут

+2

http://stackoverflow.com/questions/2550536/java-loop-for-a-certain-duration –

+0

Спасибо, что я это ищу. – sjain

ответ

11

Самый простой способ - просто проверить, сколько времени прошло на каждой итерации. Пример:

final long NANOSEC_PER_SEC = 1000l*1000*1000; 

long startTime = System.nanoTime(); 
while ((System.nanoTime()-startTime)< 5*60*NANOSEC_PER_SEC){ 
    // do stuff 
} 

Это запустит цикл, пока не истечет более 5 минут.

Примечания:

  1. текущей итерации цикла будет всегда полные, так что на практике она всегда будет работать на чуть более 5 минут.
  2. Для этого приложения System.nanoTime() более подходит, чем System.currentTimeMillis(), потому что последний изменится, если системные часы компьютера будут отрегулированы, таким образом отбрасывая расчет. Спасибо Shloim за это.
+2

Если пользователь настраивает свои часы во время работы вашего цикла, ваш цикл не будет работать в течение 1 минуты. Это может продолжаться месяцами или годами. Это потому, что 'System.currentTimeMillis()' возвращает количество msecs с 1970/01/01-00: 00: 00. Вам нужен счетчик времени, который является монотонным, например 'System.nanoTicks()' – Shloim

1

Поскольку вы говорите об API-интерфейсе таймера, я предполагаю, что вы находитесь за задержкой вместо «цикла, работающего на 5 минут». Если это так, вы можете использовать что-то вроде Thread.sleep(..), что позволит процессору делать больше полезных вещей, которые ожидают ожидание. Или, по крайней мере, сэкономить немного энергии и планеты.

+0

Да, для простой задержки это правильный ответ. Вопрос немного неясен ... – sleske

2

Этот цикл будет работать в течение 5 минут. Это не будет производиться путем внесения изменений в дату/время компьютера (либо пользователем, либо NTP).

long endTime = System.nanoTicks() + TimeUnit.NANOSECONDS.convert(5L, TimeUnit.MINUTES); 
while (System.nanoTicks() < endTime){ 
    // do whatever 
} 

Другие методы, такие как System.currentTimeMillis() следует избегать, поскольку они опираются на дату/время, компьютер.

Смежные вопросы