TimeUnit是一個時間單位枚舉類,主要用於併發編程,時間單元表示給定粒度單元的時間持續時間,並提供實用程序方法來跨單元轉換,以及在這些單元中執行計時和延遲操作。
1.時間單位換算
(1)支持的單位
TimeUnit.DAYS //天 TimeUnit.HOURS //小時 TimeUnit.MINUTES //分鐘 TimeUnit.SECONDS //秒 TimeUnit.MILLISECONDS //毫秒 TimeUnit.MICROSECONDS //微秒 TimeUnit.NANOSECONDS //納秒
(2)轉換方法,例如:TimeUnit.HOURS 的轉換源碼
HOURS { public long toNanos(long d) { return x(d, C5/C0, MAX/(C5/C0)); } public long toMicros(long d) { return x(d, C5/C1, MAX/(C5/C1)); } public long toMillis(long d) { return x(d, C5/C2, MAX/(C5/C2)); } public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); } public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); } public long toHours(long d) { return d; } public long toDays(long d) { return d/(C6/C5); } public long convert(long d, TimeUnit u) { return u.toHours(d); } int excessNanos(long d, long m) { return 0; } }
(3)使用舉例
//小時轉換爲秒
long sec = TimeUnit.HOURS.toSeconds(1);
System.out.println("sec:" + sec);
// 另一種形式
long sec2 = TimeUnit.SECONDS.convert(1, TimeUnit.HOURS);
System.out.println("sec2:" + sec2);
輸出結果:
sec:3600
sec2:3600
2.計時操作
(1)例如:嘗試獲取鎖50毫秒
Lock lock = ...; if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...
3.延遲操作
(1)比如當前線程延遲5s
TimeUnit.SECONDS.sleep(5);
4.TimeUnit 與 Thread sleep的區別
(1)TimeUnit 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 sleep的底層調用了Thread.sleep。
(2)區別:TimeUnit sleep使用起來更方便,更易懂
比如:比如當前線程延遲5s:
使用Thread.sleep
Thread.sleep(5000);
// 或者
Thread.sleep(5*1000);
使用TimeUnit
TimeUnit.SECONDS.sleep(5);