Thread.sleep frente a TimeUnit.SECONDS.sleep

91

Si voy a tener una llamada para que un Java Thread se suspenda, ¿hay alguna razón para preferir una de estas formas sobre la otra?

Thread.sleep(x)

o

TimeUnit.SECONDS.sleep(y)
Raquel
fuente
1
Otra opción esThread.sleep(Duration.ofSeconds(s).toMillis())
cambunctious

Respuestas:

126

TimeUnit.SECONDS.sleep(x)llamará Thread.sleep. La única diferencia es la legibilidad y el uso TimeUnitprobablemente sea más fácil de entender para duraciones no obvias (por ejemplo: Thread.sleep(180000)vs.TimeUnit.MINUTES.sleep(3) ).

Para referencia, vea a continuación el código de sleep()en TimeUnit:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}
Assylias
fuente
FYI: El proyecto Selenium tiene un método Sleeper que no requiere capturar una excepción cuando se usa: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…
djangofan
1
Estoy de acuerdo. Si desea declarar su tiempo de sueño como una constante que puede cambiar más tarde, digamos, de 1 minuto a 10 segundos, una solución es public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);. Esto permite, Thread.sleep()pero mantiene la ventaja de legibilidad de TimeUnit.
Ole VV
8

Ellos son iguales. Yo prefiero este último porque es más descriptivo y permite elegir la unidad de tiempo (ver TimeUnit): DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS.

Tomasz Nurkiewicz
fuente
5
argumentativo: prefiero el primero - quiero que el hilo duerma, no el SECONDSo MILLISECONDS[:-)
user85421
3
@CarlosHeuberger: bueno, puedes leerlo como sueño para xSECONDS , pero seguro que es cuestión de gustos. Por otro lado, tenga en cuenta que el método sleep()está activado, staticpor Threadlo que se podría argumentar que no está claro qué hilo se supone que debe dormir (¿qué Thread myThread = ...; myThread.sleep()significa?)
Tomasz Nurkiewicz
6
@CarlosHeuberger Sería mucho mejor poder escribirThread.sleep(3, TimeUnit.SECONDS)
assylias
Actualizado para eliminar cualquier confusión acerca de la equivalencia debido a las unidades elegidas
Rachel
@assylias Estoy de acuerdo, pero desafortunadamente no puedo cambiarlo [: - |
user85421