Thread.sleep与TimeUnit.SECONDS.sleep


91

如果我要打个电话让Java Thread进入睡眠状态,是否有理由偏爱其中一种而不是另一种?

Thread.sleep(x)

要么

TimeUnit.SECONDS.sleep(y)

1
另一个选择是Thread.sleep(Duration.ofSeconds(s).toMillis())
雄心勃勃的

Answers:


126

TimeUnit.SECONDS.sleep(x)会打电话给Thread.sleep。唯一的区别是可读性,并且TimeUnit在不明显的持续时间内使用(例如:Thread.sleep(180000)vs TimeUnit.MINUTES.sleep(3).)可能更容易理解。

供参考,请参见以下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);
    }
}

仅供参考:Selenium项目有一个Sleeper方法,在使用它时不需要捕获异常: selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…–
djangofan

1
我同意。如果要将睡眠时间声明为一个常量,可以稍后更改,例如从1分钟更改为10秒,则一种解决方案是public static final long SLEEPING_TIME = TimeUnit.MINUTES.toMillis(1);。这允许Thread.sleep()但保持的可读性优势TimeUnit
Ole VV

8

他们是一样的。我更喜欢后者,因为它是更具描述性的,并允许选择时间单位(见TimeUnit): ,DAYSHOURSMICROSECONDSMILLISECONDSMINUTES,。NANOSECONDSSECONDS


5
争论性的:我更喜欢第一个-我想让线程进入睡眠状态,而不是SECONDSor MILLISECONDS[:-)
user85421 2012年

3
@CarlosHeuberger:好吧,您可以将其作为x的睡眠SECONDS来阅读,但是肯定是有品味的。在另一方面,注意,sleep()static于法Thread-所以有人可能会争辩说,目前尚不清楚该线程将睡眠(什么呢Thread myThread = ...; myThread.sleep()是什么意思?)
托马斯Nurkiewicz

6
@CarlosHeuberger会写得更好Thread.sleep(3, TimeUnit.SECONDS)
assylias 2012年

已更新,以消除因所选单位而引起的对等的任何混淆
Rachel

@assylias我同意,但是很遗憾,我无法更改它[:-|
user85421 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.