Thread.sleep vs. TimeUnit.SECONDS.sleep

89

Se eu vou ter uma chamada para que um Java Thread entre no modo de espera, há um motivo para preferir um desses formulários em vez do outro?

Thread.sleep(x)

ou

TimeUnit.SECONDS.sleep(y)
Rachel
fonte
1
Outra opção éThread.sleep(Duration.ofSeconds(s).toMillis())
cambunctious

Respostas:

122

TimeUnit.SECONDS.sleep(x)vai ligar Thread.sleep. A única diferença é a legibilidade e o uso TimeUnité provavelmente mais fácil de entender para durações não óbvias (por exemplo: Thread.sleep(180000)vs. TimeUnit.MINUTES.sleep(3)).

Para referência, veja abaixo o código de sleep()em TimeUnit:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}
assilias
fonte
Para sua informação: o projeto Selenium tem um método Sleeper que não exige a captura de uma exceção ao usá-lo: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…
djangofan
1
Concordo. Se você quiser declarar que seu tempo de sono é uma constante que pode ser alterada posteriormente, digamos, de 1 minuto a 10 segundos, uma solução é public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);. Isso permite, Thread.sleep()mas mantém a vantagem de legibilidade de TimeUnit.
Ole VV
8

Eles são os mesmos. Eu prefiro o último porque é mais descritivo e permite escolher unidade de tempo (ver TimeUnit): DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS.

Tomasz Nurkiewicz
fonte
5
argumentativo: Prefiro o primeiro - quero que o tópico durma, não o SECONDSou MILLISECONDS[:-)
user85421
3
@CarlosHeuberger: bem, você pode ler como sleep for xSECONDS , mas com certeza é uma questão de gosto. Por outro lado, observe que o método sleep()está staticativado Thread- então pode-se argumentar que não está claro qual fio deve dormir (o que Thread myThread = ...; myThread.sleep()significa?)
Tomasz Nurkiewicz
6
@CarlosHeuberger Seria muito melhor poder escreverThread.sleep(3, TimeUnit.SECONDS)
assylias
Atualizado para remover qualquer confusão sobre equivalência por causa das unidades escolhidas
Rachel
@assylias Eu concordo, mas infelizmente não posso mudar isso [: - |
user85421