今天在研究 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