Thread.sleep contre TimeUnit.SECONDS.sleep

89

Si je vais avoir un appel pour faire dormir un thread Java, y a-t-il une raison de préférer l'une de ces formes à l'autre?

Thread.sleep(x)

ou

TimeUnit.SECONDS.sleep(y)
Rachel
la source
1
Une autre option estThread.sleep(Duration.ofSeconds(s).toMillis())
cambunctious le

Réponses:

122

TimeUnit.SECONDS.sleep(x)appellera Thread.sleep. La seule différence est la lisibilité et l'utilisation TimeUnitest probablement plus facile à comprendre pour des durées non évidentes (par exemple: Thread.sleep(180000)vs. TimeUnit.MINUTES.sleep(3)).

Pour référence, voir ci-dessous le code de sleep()dans TimeUnit:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}
assylies
la source
FYI: Le projet Selenium a une méthode Sleeper qui ne nécessite pas d'attraper une exception lors de son utilisation: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…
djangofan
1
Je suis d'accord. Si vous souhaitez déclarer votre temps de sommeil une constante que vous pouvez modifier plus tard, par exemple de 1 minute à 10 secondes, une solution est public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);. Cela permet Thread.sleep()mais maintient l'avantage de lisibilité de TimeUnit.
Ole VV
8

Ce sont les mêmes. Je préfère cette dernière car il est plus descriptif et permet de choisir l' unité de temps (voir TimeUnit): DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS.

Tomasz Nurkiewicz
la source
5
argumentatif: je préfère le premier - je veux que le fil de discussion s'endorme, pas le SECONDSou MILLISECONDS[:-)
user85421
3
@CarlosHeuberger: eh bien, vous pouvez le lire comme sleep for xSECONDS , mais c'est sûrement une question de goût. D'autre part, notez que la méthode sleep()est staticactivée Thread- on pourrait donc dire qu'il n'est pas clair quel fil est censé dormir (qu'est-ce que cela Thread myThread = ...; myThread.sleep()signifie?)
Tomasz Nurkiewicz
6
@CarlosHeuberger serait beaucoup mieux de pouvoir écrireThread.sleep(3, TimeUnit.SECONDS)
assylias
Mise à jour pour éliminer toute confusion sur l'équivalence en raison des unités choisies
Rachel
@assylias Je suis d'accord, mais je ne suis malheureusement pas en mesure de le modifier [: - |
user85421