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


person ardb    schedule 08.06.2014    source источник
comment
Используйте 1_.   -  person Tiny    schedule 08.06.2014
comment
Рассмотрите возможность использования таймера   -  person PeterMmm    schedule 08.06.2014
comment
Какова цель ожидания? Вы ждете определенного события? Убедитесь, что вы понимаете, что делает метод sleep ().   -  person artdanil    schedule 08.06.2014
comment
@Tiny, это НЕ безопасно.   -  person Yousha Aleayoub    schedule 16.09.2017
comment
На самом деле это Thread.sleep(<milisecondsToSleep>). s не следует писать с заглавной буквы.   -  person Jade    schedule 26.09.2017


Ответы (7)


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

TimeUnit.SECONDS.sleep(1);

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

TimeUnit.MINUTES.sleep(1);

Чтобы поспать минутку.

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

Кроме того, sleep не очень гибок, когда дело касается управления.

Для запуска задачи каждую секунду или с задержкой в ​​одну секунду я настоятельно рекомендую ScheduledExecutorService и либо _ 7_ или _ 8_.

Например, чтобы запускать метод 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");
}
person Boris the Spider    schedule 08.06.2014
comment
@Matthew Moisen Мне не удалось запустить этот пример Java 8. Что такое App :: в точности? Изменяя myTask () на работающую лямбду, она работает: Runnable myTask = () - ›{...}; - person comfytoday; 06.12.2017
comment
Это ссылка на метод @comfytoday - я предлагаю начать с документации. - person Boris the Spider; 06.12.2017
comment
TimeUnit.SECONDS.wait(1) бросает IllegalMonitorStateException в Java 8.1, сборку 31 на Windows 6.3. Вместо этого я могу использовать Thread.sleep(1000) без попытки / уловки. - person John Meyer; 05.01.2018
comment
Вы звонили wait, а не sleep @JohnMeyer. Будь осторожнее. - person Boris the Spider; 05.01.2018
comment
В Java 8 в java.util.concurrent.TimeUnit вы получаете Unhandled exception: java.lang.InterruptedExecution для sleep(1) - person Shai Alon; 14.08.2019
comment
Вы должны окружить TimeUnit.SECONDS.sleep(1); try catch - person Shai Alon; 14.08.2019
comment
@ShaiAlon Что обычно может быть в этом блоке catch? - person Stephane; 19.08.2019
comment
Если кто-то все еще борется с этой функцией, сделайте включающую функцию, которая вызывает sleep(), выбросьте InterruptedException с throws и поймайте его там, где функция вызывается. @Stephane Или просто заключите этот оператор в try-catch, чтобы поймать InterruptedException и распечатать трассировку стека. - person need_to_know_now; 21.02.2021

Используйте 1_;

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

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}
person Anju Aravind    schedule 08.06.2014
comment
Не забудьте зарегистрировать InterruptedException, иначе вы никогда не узнаете, что этот поток был прерван. - person m0skit0; 15.11.2016
comment
Мне любопытно, что Thread.currentThread (). Interrupt (); делает здесь. - person Brent212; 16.08.2018
comment
см .: Почему мы снова должны прерывать поток? здесь: javaspecialists.eu/archive/Issue056.html - person Tristan; 03.12.2018

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

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

и затем вы можете вызвать этот метод где угодно, например:

wait(1000);
person Hecanet    schedule 20.08.2019
comment
Что делает Thread.currentThread().interrupt();? Почему это важно? - person Dirk Schumacher; 19.07.2021

Вам нужно использовать вызов Thread.sleep().

Дополнительная информация здесь: http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html

person Ruslan    schedule 08.06.2014

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

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

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

person Michael Gantman    schedule 19.08.2018
comment
Использование catch (InterruptedException e) { /* empty */ } здесь НЕ является разумным решением. По крайней мере, вы должны предоставить некоторую информацию журнала. Для получения дополнительной информации по теме см. javaspecialists.eu/archive/Issue056.html - person Marco13; 19.08.2018
comment
@ Marco13 На самом деле из-за вашего комментария и комментариев некоторых других людей я изменил метод TimeUtils.sleepFor (), и теперь он прерывает текущий поток. Таким образом, это по-прежнему удобно, поскольку вам не нужно перехватывать InterruptedException, но теперь механизм прерывания работает. - person Michael Gantman; 10.05.2021

Используйте 1_. Единица времени - миллисекунды.

Например:

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]);
        }
    }
}
person Bachan Joseph    schedule 14.11.2018

Я знаю, что это очень старый пост, но это может кому-то помочь: вы можете создать метод, поэтому всякий раз, когда вам нужно сделать паузу, вы можете ввести 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, когда вы хотите сделать паузу.

person dominic03    schedule 11.06.2019
comment
Глядя на почти такой же ответ @Hecanet, нет Thread.currentThread().interrupt(); Если это важно, почему он не отображается? - Если это не важно, почему его нужно вставить / опустить? - person Dirk Schumacher; 19.07.2021