Как приостановить мою программу Java на 2 секунды

Я новичок в Java и делаю небольшую игру для практики.

if (doAllFaceUpCardsMatch == false) {
        //run pause here//
        concentration.flipAllCardsFaceDown();
} else {
        concentration.makeAllFaceUpCardsInvisible();
}

Я хочу поставить игру на паузу на две секунды, прежде чем это произойдет.

concentration.flipAllCardsFaceDown();

Как бы мне сделать паузу?


person Ethanph89    schedule 19.04.2017    source источник
comment
Возможный дубликат Как сделать задержку в Java?   -  person Manav Dubey    schedule 20.04.2017
comment
Thread.sleep был бы очевидным выбором, однако, если вы используете графический интерфейс, такой как Swing или JavaFX, вам не следует делать это из контекста их потоков диспетчеризации, это было бы очень, очень плохо. У большинства UI-фреймворков для этого есть свои собственные определенные механизмы, но у нас нет такой информации.   -  person MadProgrammer    schedule 20.04.2017
comment
Когда я делаю Thread.sleep(), я получаю: ошибка: незарегистрированное исключение InterruptedException; должен быть пойман или объявлен для запуска Thread.sleep(2000); при компиляции   -  person Ethanph89    schedule 20.04.2017
comment
@ Ethanph89 Хорошо, компилятор говорит вам, что именно вам нужно сделать: поймать InterruptedException или объявить, что он будет выброшен.   -  person Andy Turner    schedule 20.04.2017
comment
Кстати, не сравнивайте явно true и false.   -  person EJoshuaS - Reinstate Monica    schedule 20.04.2017


Ответы (5)


Вы можете использовать:

 Thread.sleep(2000);

or

java.util.concurrent.TimeUnit.SECONDS.sleep(2);

Обратите внимание, что оба этих метода выдают InterruptedException, которое является проверенным исключением, поэтому вам придется его поймать или объявить в методе.

Изменить: после перехвата исключения ваш код будет выглядеть так:

if (doAllFaceUpCardsMatch == false) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        concentration.flipAllCardsFaceDown();
} else {
        concentration.makeAllFaceUpCardsInvisible();
}

Поскольку вы новичок, я бы порекомендовал научиться обрабатывать исключения, как только вы немного освоитесь с java.

person Ashish Gupta    schedule 19.04.2017
comment
Спасибо за помощь! Как я уже сказал, я новичок в Java (и в большинстве программ в целом) - как мне поймать исключение? - person Ethanph89; 20.04.2017

Для тех, кто просто хочет быстро взломать, не прибегая к библиотеке...

public class Timing {
    public static void main(String[] args) {
            int delay = 1000; // number of milliseconds to sleep

            long start = System.currentTimeMillis();
            while(start >= System.currentTimeMillis() - delay); // do nothing

            System.out.println("Time Slept: " + Long.toString(System.currentTimeMillis() - start));
    }
}

Для высокоточных игр со скоростью 60 кадров в секунду это, вероятно, не то, что вам нужно, но, возможно, некоторые сочтут это полезным.

person Scotty Stephens    schedule 11.05.2018
comment
Это имеет расточительную высокую загрузку ЦП. - person MrTux; 17.06.2019
comment
Это то, что мне нужно. Популярный подход Swing Timer не работает, потому что основной поток продолжается, пока выполняется Timer. - person Falsoon; 01.12.2020

Вы можете найти аналогичный пост здесь: Как сделать задержку в Java?

В основном то, что написано в старом посте. Вы можете использовать java.util.concurrent.TimeUnit

    import java.util.concurrent.TimeUnit;

    if (doAllFaceUpCardsMatch == false) {
        TimeUnit.SECONDS.sleep(2);
        concentration.flipAllCardsFaceDown();
    } else {
        concentration.makeAllFaceUpCardsInvisible();
    }
person Lululicious    schedule 19.04.2017

Вы можете использовать Thread.currentThread().sleep(2000), чтобы приостановить текущий поток на 2 секунды (2000 миллисекунд). Вы должны окружить это с помощью try/catch в случае InterruptedException.

person ILIkeEggs    schedule 19.04.2017

Еще один очень простой способ — создать следующий метод:

public static void pause(long timeInMilliSeconds) {

    long timestamp = System.currentTimeMillis();


    do {

    } while (System.currentTimeMillis() < timestamp + timeInMilliSeconds);

}
person ACSJR    schedule 10.04.2020
comment
Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество. вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Brian; 10.04.2020
comment
Думаю, это нормально для всех, кто знает, что такое метод и как его вызывать. Если кто-то не знает, этот должен быть здесь не для копирования и вставки кода, а для изучения базового курса Java. Есть очень прямая грань между протягиванием руки помощи и сковыванием души. - person ACSJR; 12.04.2020