2013-11-26 3 views
0

У меня есть цикл while, который нужно повторять один раз в секунду, и я понятия не имею, как это сделать. Я даже никогда не использовал модуль времени Java или что бы он ни называл.Повторить цикл один раз в секунду

Базовый цикл показан ниже. Может ли кто-нибудь дать мне совет о том, как это сделать?

while (!isOver()) { 
    // do some work 
} 
+5

Thread.sleep (1000)? –

+0

@ benjamin.d Должен ли я помещать это в тело цикла непосредственно перед концом или в оператор while()? – Hosch250

+0

В теле. Проверьте ответы ниже –

ответ

4

Возможно, этот фрагмент кода может помочь вам. Это запланированная timertask, которая будет повторять метод run() каждые 1 секунду. Вы можете добавить туда, где хотите.

TimerTask timerTask = new TimerTask() 
{ 
    public void run() 
    { 
     .... //Whatever inside your loop will be executed every second 
    } 
}; 

.... 

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(timerTask, 0, 1000); 

Надеюсь, это поможет! :)

+0

@JimN отредактировал мой ответ. Благодарю. – axierjhtjz

+0

Когда Java, наконец, поддерживает закрытие, тогда решения, которые выглядят так, будут намного более распространены. –

+0

Приятно использовать их в Android. Я думаю, что это идеальное решение для такого рода проблем. Но вы совершенно правы @JasonSperske. – axierjhtjz

0
private void time() { 
    while (! isOver) { 
     try { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) { 
      //Do nothing, just loop 
     } 
    } 
} 

А потом начать что в другом потоке, чтобы ваш основной поток будет продолжаться:

new Thread(this::time).start(); 
+2

Зачем ему спать минутку? –

+0

Спасибо, но братья Deitel еще не научили меня попробовать. – Hosch250

+0

Я вырезал и вставлял код с реального кода (который ждет минуту) – Kong

2

Ниже будет делать.

while (!isOver()) { 
    // do some work 
    try { 
     Thread.sleep(1000); /* 1000ms or 1 second */ 
    } catch(InterruptedException e) { 
     // handle 
    } 
} 
+0

Спасибо. Нужно ли мне что-то импортировать? NetBeans не собирает Thread. – Hosch250

+2

Нет. Вам не нужно ничего импортировать – Prateek

+1

О, это говорит, что мне нужно заявление Try. Я поставлю один и посмотрю, как это происходит. – Hosch250

2

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

Каждая программа имеет один поток во все времена. Если это не так, это не процесс. Это ваш основной поток, он приходит в «жизнь», когда запускается ваша программа, и умирает, когда ваша программа завершается. Существует статический метод для Thread, называемый sleep (int ms). Это приостанавливает обработку потока до тех пор, пока не истечет миллисекунда параметра (ms). Поэтому Thread.sleep (1000) приостанавливает поток в течение одной секунды, а затем возобновляет.

Приостановки основного потока в течение одной секунды каждого раза, выглядит следующим образом:

while(!isOver()) { 
    // Do stuff 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // Deal with exception here 
    } 
} 

Надеется, что это помогает. Существует еще один способ создания потоков, но для этого он слишком длинный и вытянутый.

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

0

Как вы можете видеть, существует множество способов сделать то, что вы ищете. Вот еще один способ. Я стараюсь уклоняться от таймеров, если ваш код может генерировать исключения, так как он перестанет запускать таймер. Что-то вроде этого будет работать с несколькими меньшими затратами.

ScheduledExecutorService e = Executors.newSingleThreadScheduledExecutor(); 

e.scheduleAtFixedRate(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 

    }, 0, 1, TimeUnit.SECONDS); 
} 

Или, если вы хотите, чтобы сделать сон, вы можете попробовать:

while(!isOver) { 
    //DO WORK 

    try { 
    //Be careful if you are holding any Locks they will not be released 
    TimeUnit.SECONDS.sleep(1); 
    } catch (InterruptedException e) { 
     //Do nothing, just loop 
    } 
} 
+0

Спасибо. Это всего лишь небольшое симуляция гонки Tortoise и Hare, которая повторяет цикл, когда-то показывающая, где они находятся, и, вероятно, никогда не будет запущена снова, поэтому я думаю, что сейчас это нормально. – Hosch250

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