Как сделать задержку в Java?
Я пытаюсь сделать что-то в Java, и мне нужно что-то ждать / задерживать в течение нескольких секунд в цикле while.
while (true) {
if (i == 3) {
i = 0;
}
ceva[i].setSelected(true);
// I need to wait here
ceva[i].setSelected(false);
// I need to wait here
i++;
}
Я хочу построить пошаговый секвенсор и я новичок в Java. Есть предложения?
4 ответов:
если вы хотите сделать паузу, то используйте
java.util.concurrent.TimeUnit:TimeUnit.SECONDS.sleep(1);поспать одну секунду или
TimeUnit.MINUTES.sleep(1);поспать минутку.
поскольку это цикл, это представляет собой неотъемлемую проблему - дрейф. Каждый раз, когда вы запускаете код, а затем спите, вы будете немного дрейфовать от запуска, скажем, каждую секунду. Если это проблема, то не используйте
sleep.далее
sleepне очень гибко, когда речь заходит о контроле.для запуск задачи каждую секунду или с задержкой в одну секунду я бы сильно рекомендую
ScheduledExecutorServiceиscheduleAtFixedRateилиscheduleWithFixedDelay.например, чтобы запустить метод
myTaskкаждую секунду (Java 8):public static void main(String[] args) { final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS); } private static void myTask() { System.out.println("Running"); }и в Java 7:
public static void main(String[] args) { final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { myTask(); } }, 0, 1, TimeUnit.SECONDS); } private static void myTask() { System.out.println("Running"); }
использовать
Thread.sleep(1000);
1000- это количество миллисекунд, в течение которых программа будет приостановлена.try { Thread.sleep(1000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); }
вы должны использовать
Thread.sleep()звонок.подробнее здесь:http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
используя
TimeUnit.SECONDS.sleep(1);илиThread.sleep(1000);- это приемлемый способ сделать это. В обоих случаях вы должны пойматьInterruptedExceptionчто делает ваш код громоздким.Существует библиотека java с открытым исходным кодом под названием MgntUtils (написанная мной), которая предоставляет утилиту, которая уже имеет дело сInterruptedExceptionвнутри. Поэтому ваш код будет включать только одну строку:TimeUtils.sleepFor(1, TimeUnit.SECONDS);см. javadoc здесь. Вы можете получить доступ к библиотеке из Maven Central или Github. Статья, объясняющая о библиотека может быть найдена здесь
Comments