Я получаю исключение при использовании Thread.sleep (x) или wait () - PullRequest
339 голосов
/ 27 июля 2010

Я пытался отложить (или уложить) мою Java-программу, но произошла ошибка.

Я не могу использовать Thread.sleep(x) или wait().Появляется то же сообщение об ошибке:

незарегистрированное исключение java.lang.InterruptedException;должен быть пойман или объявлен брошенным.

Требуется ли какой-либо шаг перед использованием методов Thread.sleep() или wait()?

Ответы [ 13 ]

0 голосов
/ 17 января 2018

Использование java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Сон на одну секунду или

TimeUnit.MINUTES.sleep(1);

Сон на минуту.

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

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

Для запуска задачи каждую секунду или вс задержкой в ​​одну секунду я бы настоятельно рекомендовал бы [ScheduledExecutorService] [1] и либо [scheduleAtFixedRate] [2], либо [scheduleWithFixedDelay] [3].

Комузапускайте метод 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");
}
0 голосов
/ 20 ноября 2017

Более простой способ ожидания - использовать System.currentTimeMillis(), который возвращает количество миллисекунд с полуночи 1 января 1970 года по UTC. Например, подождать 5 секунд:

public static void main(String[] args) {
    //some code
    long original = System.currentTimeMillis();
    while (true) {
        if (System.currentTimeMillis - original >= 5000) {
            break;
        }
    }
    //more code after waiting
}

Таким образом, вам не нужно разбираться с потоками и исключениями. Надеюсь, это поможет!

0 голосов
/ 15 июня 2013

В качестве альтернативы, если вы не хотите иметь дело с потоками, попробуйте этот метод:

public static void pause(int seconds){
    Date start = new Date();
    Date end = new Date();
    while(end.getTime() - start.getTime() < seconds * 1000){
        end = new Date();
    }
}

Он начинается, когда вы звоните, и заканчивается, когда прошло количество секунд.

...