Як зробити затримку на Java?


344

Я намагаюся щось зробити на Java, і мені потрібно щось чекати / затримувати протягом секунди в циклі.

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. Будь-які пропозиції?


19
Використовуйте Thread.Sleep().
Крихітний

2
Подумайте про використання таймера
PeterMmm

2
Яка мета чекати? Чи очікуєте, що станеться якась подія? Переконайтесь, що ви розумієте, що робить метод сну ()
artdanil

@Tiny, це НЕ безпечно.
Yousha Aleayoub

12
Це насправді Thread.sleep(<milisecondsToSleep>). Не sслід використовувати великі літери.
Бенджамін

Відповіді:


678

Якщо ви хочете зробити паузу, використовуйте 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. Що таке App :: саме? Змінивши myTask () на лямбда, що працює, він працює: Runnable myTask = () -> {...};
comfytoday

2
Це посилання на метод @comfytoday - пропоную почати з документації .
Борис Павук

TimeUnit.SECONDS.wait(1)кидає IllegalMonitorStateExceptionв Java 8.1 build 31 на Windows 6.3. Натомість я можу використовуватись Thread.sleep(1000)без спроби / лову.
Джон Мейєр

1
В Java 8, в java.util.concurrent.TimeUnit ви отримаєте Unhandled exception: java.lang.InterruptedExecutionзаsleep(1)
Шай Алон

1
Ви повинні оточувати TimeUnit.SECONDS.sleep(1);зtry catch
Шай Алон

148

Використання Thread.sleep(1000);

1000 - це кількість мілісекунд, яку програма призупинить.

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

5
Не забудьте записати InterruptException, інакше ви ніколи не дізнаєтесь, що ця тема перервана.
m0skit0

12
Мені цікаво про те, що Thread.currentThread (). Interrupt (); робить тут.
Brent212

1
див .: "Чому нам доведеться знову переривати нитку?" тут: javaspecialists.eu/archive/Issue056.html
Трістан


5

використовуй це:

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

то ви можете зателефонувати цьому методу де завгодно:

        wait(1000);

3

Використання TimeUnit.SECONDS.sleep(1);або Thread.sleep(1000);прийнятний спосіб зробити це. В обох випадках вам доведеться InterruptedExceptionзафіксувати ваш код Bulky. Існує 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на кількість мілісекунд, щоб зробити паузу. Таким чином, вам не потрібно вставляти всю заяву про випробування, коли ви хочете зробити паузу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.