Thread.sleep проти TimeUnit.SECONDS.sleep


91

Якщо я збираюся зателефонувати, щоб Java Thread заснула, чи є причина віддати перевагу одній із цих форм перед іншою?

Thread.sleep(x)

або

TimeUnit.SECONDS.sleep(y)

1
Інший варіантThread.sleep(Duration.ofSeconds(s).toMillis())
камбунктивний

Відповіді:


126

TimeUnit.SECONDS.sleep(x)зателефонує Thread.sleep. Єдина відмінність - читабельність, і використання TimeUnit, мабуть, легше зрозуміти при неочевидних тривалостях (наприклад: Thread.sleep(180000)проти TimeUnit.MINUTES.sleep(3)).

Для довідки див. Нижче код sleep()в TimeUnit:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}

FYI: Селен проект має метод Sleeper , який не вимагає ловити виключення при його використанні: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa / ...
djangofan

1
Я згоден. Якщо ви хочете оголосити час сну константою, яку ви можете змінити пізніше, скажімо, від 1 хвилини до 10 секунд, одне із рішень public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);. Це дозволяє, Thread.sleep()але підтримує перевагу читабельності TimeUnit.
Оле В. В.

8

Вони однакові. Я віддаю перевагу останній , тому що це більш описовий характер і дозволяє вибрати одиницю часу (див TimeUnit): DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS.


5
аргументовано: Я віддаю перевагу першому - я хочу, щоб нитка спала, а не SECONDSабо MILLISECONDS[:-)
user85421

3
@CarlosHeuberger: ну, ти можеш читати це як сон для xSECONDS , але, безумовно, це справа смаку. З іншого боку, зауважте, що sleep()це staticметод, Threadтому можна стверджувати, що незрозуміло, яка нитка передбачається спати (що Thread myThread = ...; myThread.sleep()означає?)
Томаш Нуркевич

6
@CarlosHeuberger Було б набагато краще, щоб мати можливість писатиThread.sleep(3, TimeUnit.SECONDS)
assylias

Оновлено, щоб усунути будь-яку плутанину щодо еквівалентності через вибрані одиниці
Рейчел

@assylias Я згоден, але, на жаль, я не можу змінити це [: - |
user85421
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.