今天在研究 RateLimiter 類的時候,無心中看到了下面這行代碼:線程
NANOSECONDS.sleep(remainingNanos);
點進去看了下實現方式,發現用的是 Thread 提供的 sleep 方法,代碼以下:code
public void sleep(long timeout) throws InterruptedException { if (timeout > 0) { long ms = toMillis(timeout); int ns = excessNanos(timeout, ms); Thread.sleep(ms, ns); } }
原來 TimeUnit 枚舉類中也提供了一個線程睡眠的方法,且線程在睡眠的過程當中被打斷,一樣會拋出一個 InterruptedException 異常。rem
既然 TimeUnit 提供的 sleep 功能和 Thread 提供的 sleep 功能同樣同樣,那麼 TimeUnit 爲何還要實現 * sleep* 方法?我想最大的緣由就是可讀性和易用性的提高,來看下面的例子:it
// 睡眠4秒 TimeUnit.SECONDS.sleep(4); // 睡眠4秒 Thread.sleep(4 * 1000);
結果顯而易見,明顯上面的編寫方式更直觀,更簡潔,之後再有涉及到線程睡眠的地方能夠直接使用 TimeUnit 枚舉類中的 sleep 方法。io