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

Ответ 1

Если вы хотите сделать паузу, используйте 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");
}

Ответ 2

Используйте Thread.sleep(1000);

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

try
{
    Thread.sleep(1000);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
}

Ответ 4

Используйте 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]);
        }
    }
}

Ответ 5

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

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

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

Ответ 6

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

Ответ 7

while (true) {
    if (i == 3) {
        i = 0;
    }

    ceva[i].setSelected(true);

     try{Thread.sleep(time_in_milliseconds);}catch(InterruptedException ie){}

    ceva[i].setSelected(false);

     try{Thread.sleep(1000);}catch(InterruptedException ie){}

    i++;
}

1 секунда - 1000 миллисекунд.

Ответ 8

используйте это:

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

тогда вы можете вызывать этот метод в любом месте, например:

        wait(1000);

Ответ 9

подождите несколько секунд, чтобы ваш компилятор использовал этот статический класс TimeUnit.SECONDS.sleep(1); это включает в java.util.concurrent.TimeUnit свободы