Как сделать задержку в 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. Есть предложения?

967   4  

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

    Ничего не найдено.