Thread.sleep vs. TimeUnit.SECONDS.sleep

91

Jika saya akan mendapat panggilan agar Thread Java tertidur, adakah alasan untuk memilih salah satu dari formulir ini daripada yang lain?

Thread.sleep(x)

atau

TimeUnit.SECONDS.sleep(y)
Rachel
sumber
1
Pilihan lainnya adalahThread.sleep(Duration.ofSeconds(s).toMillis())
cambunctious

Jawaban:

126

TimeUnit.SECONDS.sleep(x)akan menelepon Thread.sleep. Satu-satunya perbedaan adalah keterbacaan dan penggunaan TimeUnitmungkin lebih mudah dipahami untuk jangka waktu yang tidak jelas (misalnya: Thread.sleep(180000)vs. TimeUnit.MINUTES.sleep(3)).

Sebagai referensi, lihat kode sleep()di bawah ini 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
sumber
FYI: Proyek Selenium memiliki metode Sleeper yang tidak memerlukan penangkapan pengecualian saat menggunakannya: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…
djangofan
1
Saya setuju. Jika Anda ingin menyatakan waktu tidur Anda konstan yang dapat diubah nanti, katakanlah, dari 1 menit hingga 10 detik, salah satu solusinya adalah public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);. Hal ini memungkinkan Thread.sleep()tetapi mempertahankan keunggulan keterbacaan TimeUnit.
Ole VV
8

Mereka sama. Saya lebih suka yang kedua karena lebih deskriptif dan memungkinkan untuk memilih satuan waktu (lihat TimeUnit): DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS.

Tomasz Nurkiewicz
sumber
5
argumentatif: Saya lebih suka yang pertama - Saya ingin utas tertidur, bukan SECONDSatau MILLISECONDS[:-)
user85421
3
@CarlosHeuberger: yah, Anda bisa membacanya sebagai sleep untuk xSECONDS , tapi pastinya itu masalah selera. Di sisi lain, catatan itu sleep()adalah staticmetode pada Thread- sehingga satu mungkin berpendapat bahwa tidak jelas yang benang mengira untuk tidur (apa Thread myThread = ...; myThread.sleep()artinya?)
Tomasz Nurkiewicz
6
@CarlosHeuberger Akan jauh lebih baik untuk dapat menulisThread.sleep(3, TimeUnit.SECONDS)
assylias
Diperbarui untuk menghilangkan kebingungan tentang kesetaraan karena unit yang dipilih
Rachel
@assylias Saya setuju, tapi sayangnya saya tidak bisa mengubahnya [: - |
pengguna85421