今天在研究 RateLimiter 类的时候,无意中看到了下面这行代码:
NANOSECONDS.sleep(remainingNanos);
点进去看了下实现方式,发现用的是 Thread 提供的 sleep 方法,代码如下:
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 异常。
既然 TimeUnit 提供的 sleep 功能和 Thread 提供的 sleep 功能一样一样,那么 TimeUnit 为什么还要实现 * sleep* 方法?我想最大的原因就是可读性和易用性的提升,来看下面的例子:
// 睡眠4秒
TimeUnit.SECONDS.sleep(4);
// 睡眠4秒
Thread.sleep(4 * 1000);
结果显而易见,明显上面的编写方式更直观,更简洁,以后再有涉及到线程睡眠的地方可以直接使用 TimeUnit 枚举类中的 sleep 方法。