Thread.sleep vs. TimeUnit.SECONDS.sleep

88

Gibt es einen Grund, eine dieser Formen der anderen vorzuziehen, wenn ich einen Anruf erhalten soll, damit ein Java-Thread in den Ruhezustand wechselt?

Thread.sleep(x)

oder

TimeUnit.SECONDS.sleep(y)
Rachel
quelle
1
Eine andere Option istThread.sleep(Duration.ofSeconds(s).toMillis())
Cambunctious

Antworten:

121

TimeUnit.SECONDS.sleep(x)wird anrufen Thread.sleep. Der einzige Unterschied ist die Lesbarkeit und die Verwendung TimeUnitist wahrscheinlich für nicht offensichtliche Zeiträume leichter zu verstehen (zum Beispiel: Thread.sleep(180000)vs. TimeUnit.MINUTES.sleep(3)).

Als Referenz siehe unten den Code von sleep()in TimeUnit:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}
Assylien
quelle
Zu Ihrer Information: Selen Projekt hat ein Schläfer Methode , die nicht erfordert eine Ausnahme abfangen , wenn es mit: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/...
djangofan
1
Genau. Wenn Sie Ihre Schlafzeit als Konstante deklarieren möchten, die Sie später ändern können, z. B. von 1 Minute auf 10 Sekunden, ist eine Lösung public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);. Dies ermöglicht Thread.sleep(), behält aber den Lesbarkeitsvorteil von bei TimeUnit.
Ole VV
8

Sie sind gleich. Ich ziehe das letztere , weil es mehr beschreibend und ermöglicht Zeiteinheit (siehe wählen TimeUnit): DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS.

Tomasz Nurkiewicz
quelle
5
argumentativ: Ich bevorzuge die erste - ich möchte, dass der Thread schläft, nicht die SECONDSoder MILLISECONDS[:-)
user85421
3
@CarlosHeuberger: Nun, Sie können es als Schlaf für xSECONDS lesen , aber es ist sicherlich Geschmackssache. Beachten Sie andererseits, dass dies sleep()eine staticMethode ist Thread- man könnte also argumentieren, dass nicht klar ist, welcher Thread schlafen soll (was bedeutet Thread myThread = ...; myThread.sleep()das?)
Tomasz Nurkiewicz
6
@ CarlosHeuberger Wäre viel besser schreiben zu könnenThread.sleep(3, TimeUnit.SECONDS)
Assylias
Aktualisiert, um Verwirrung über die Äquivalenz aufgrund ausgewählter Einheiten zu beseitigen
Rachel
@assylias Ich stimme zu, aber leider kann ich es nicht ändern [: - |
user85421