Как сделать задержку в Java?

346

Я пытаюсь что-то сделать в 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. Какие-либо предложения?

ardb
источник
19
Использование Thread.Sleep().
Крошечный
2
Подумайте об использовании таймера
PeterMmm
2
Какова цель ожидания? Вы ждете определенного события? Убедитесь, что вы понимаете, что делает метод sleep ()
artdanil
@ Крошка, это НЕ безопасно.
Юша Алеауб
12
Это на самом деле Thread.sleep(<milisecondsToSleep>). Не sдолжно быть заглавными.
Бенджамин

Ответы:

679

Если вы хотите сделать паузу, используйте java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Спать одну секунду или

TimeUnit.MINUTES.sleep(1);

Спать минуту.

Поскольку это цикл, это представляет собой внутреннюю проблему - дрейф. Каждый раз, когда вы запускаете код, а затем засыпаете, вы будете немного отвлекаться, скажем, каждую секунду. Если это проблема, не используйте sleep.

Кроме того, sleepне очень гибкий, когда дело доходит до контроля.

Для запуска задачи каждую секунду или с задержкой в ​​одну секунду я настоятельно рекомендую a 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");
}
Борис Паук
источник
1
@ Matthew Moisen Я не смог запустить этот пример Java 8. Что такое приложение :: точно? Изменяя myTask () на работающую лямбду, она работает: Runnable myTask = () -> {...};
сегодня,
2
Это ссылка на метод @comfytoday - я предлагаю начать с документации .
Борис Паук
TimeUnit.SECONDS.wait(1)выбрасывает IllegalMonitorStateExceptionв Java 8.1 build 31 на Windows 6.3. Вместо этого я могу использовать Thread.sleep(1000)без try / catch.
Джон Мейер
1
В Java 8, в java.util.concurrent.TimeUnit вы получаете Unhandled exception: java.lang.InterruptedExecutionдляsleep(1)
Shai Alon
1
Вы должны окружить TimeUnit.SECONDS.sleep(1);сtry catch
Shai Alon
148

Использование Thread.sleep(1000);

1000 это количество миллисекунд, которые программа приостановит.

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}
Анжу Аравинд
источник
5
Не забудьте зарегистрировать InterruptedException, иначе вы никогда не узнаете, что этот поток был прерван.
m0skit0
12
Мне любопытно, что Thread.currentThread (). Interrupt (); здесь
Brent212
1
смотрите: "Почему мы должны прерывать поток снова?" здесь: javaspecialists.eu/archive/Issue056.html
Тристан
6

использовать это:

public static void wait(int ms){
        try
        {
            Thread.sleep(ms);
        }
        catch(InterruptedException ex)
        {
            Thread.currentThread().interrupt();
        }
    }

тогда вы можете вызвать этот метод в любом месте, как:

        wait(1000);
Hecanet
источник
3

Использование TimeUnit.SECONDS.sleep(1);или Thread.sleep(1000);является приемлемым способом сделать это. В обоих случаях вы должны поймать, InterruptedExceptionчто делает ваш код громоздким. Существует java-библиотека с открытым исходным кодом под названием MgntUtils (написанная мной), которая предоставляет утилиту, которая уже имеет дело с InterruptedExceptionвнутренней частью . Итак, ваш код будет содержать только одну строку:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Смотрите Javadoc здесь . Вы можете получить доступ к библиотеке из Maven Central или из Github . Статью с описанием библиотеки можно найти здесь

Майкл Гантман
источник
2
Использование catch (InterruptedException e) { /* empty */ }здесь НЕ является разумным решением. По крайней мере, вы должны предоставить некоторую информацию журнала. Для получения дополнительной информации о предмете см. Javaspecialists.eu/archive/Issue056.html
Marco13
3

Использование Thread.sleep(100);. Единица времени - миллисекунды

Например:

public class SleepMessages {
    public static void main(String args[])
        throws InterruptedException {
        String importantInfo[] = {
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        };

        for (int i = 0;
             i < importantInfo.length;
             i++) {
            //Pause for 4 seconds
            Thread.sleep(4000);
            //Print a message
            System.out.println(importantInfo[i]);
        }
    }
}
Бачан Иосиф
источник
1

Я знаю, что это очень старая запись, но она может кому-то помочь: вы можете создать метод, поэтому всякий раз, когда вам нужно сделать паузу, вы можете ввести pause(1000)или любое другое значение в миллисекундах:

public static void pause(int ms) {
    try {
        Thread.sleep(ms);
    } catch (InterruptedException e) {
        System.err.format("IOException: %s%n", e);
    }
}

Это вставлено чуть выше public static void main(String[] args), внутри класса. Затем, чтобы вызвать метод, введите, pause(ms)но замените msчисло миллисекунд для приостановки. Таким образом, вам не нужно вставлять весь оператор try-catch всякий раз, когда вы хотите сделать паузу.

dominic03
источник