Java日期時間API系列5-----Jdk7及以前的日期時間類TimeUnit在併發編程中的應用

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章