TimeUnit的簡略介紹

TimeUnit源碼參見rt.jar:java.util.concurrent.TimeUnit

package java.util.concurrent;
public enum TimeUnit {
    /** Time unit representing one thousandth of a microsecond */
    NANOSECONDS {
        public long toNanos(long d)   { return d; }
        public long toMicros(long d)  { return d/(C1/C0); }
        public long toMillis(long d)  { return d/(C2/C0); }
        public long toSeconds(long d) { return d/(C3/C0); }
        public long toMinutes(long d) { return d/(C4/C0); }
        public long toHours(long d)   { return d/(C5/C0); }
        public long toDays(long d)    { return d/(C6/C0); }
        public long convert(long d, TimeUnit u) { return u.toNanos(d); }
        int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
    },

    /** Time unit representing one thousandth of a millisecond */
    MICROSECONDS {
        public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }
        public long toMicros(long d)  { return d; }
        public long toMillis(long d)  { return d/(C2/C1); }
        public long toSeconds(long d) { return d/(C3/C1); }
        public long toMinutes(long d) { return d/(C4/C1); }
        public long toHours(long d)   { return d/(C5/C1); }
        public long toDays(long d)    { return d/(C6/C1); }
        public long convert(long d, TimeUnit u) { return u.toMicros(d); }
        int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
    },

    /** Time unit representing one thousandth of a second */
    MILLISECONDS {
        public long toNanos(long d)   { return x(d, C2/C0, MAX/(C2/C0)); }
        public long toMicros(long d)  { return x(d, C2/C1, MAX/(C2/C1)); }
        public long toMillis(long d)  { return d; }
        public long toSeconds(long d) { return d/(C3/C2); }
        public long toMinutes(long d) { return d/(C4/C2); }
        public long toHours(long d)   { return d/(C5/C2); }
        public long toDays(long d)    { return d/(C6/C2); }
        public long convert(long d, TimeUnit u) { return u.toMillis(d); }
        int excessNanos(long d, long m) { return 0; }
    },

    /** Time unit representing one second */
    SECONDS {
        public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }
        public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }
        public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }
        public long toSeconds(long d) { return d; }
        public long toMinutes(long d) { return d/(C4/C3); }
        public long toHours(long d)   { return d/(C5/C3); }
        public long toDays(long d)    { return d/(C6/C3); }
        public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
        int excessNanos(long d, long m) { return 0; }
    },

    /** Time unit representing sixty seconds */
    MINUTES {
        public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
        public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
        public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
        public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
        public long toMinutes(long d) { return d; }
        public long toHours(long d)   { return d/(C5/C4); }
        public long toDays(long d)    { return d/(C6/C4); }
        public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
        int excessNanos(long d, long m) { return 0; }
    },

    /** Time unit representing sixty minutes */
    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; }
    },

    /** Time unit representing twenty four hours */
    DAYS {
        public long toNanos(long d)   { return x(d, C6/C0, MAX/(C6/C0)); }
        public long toMicros(long d)  { return x(d, C6/C1, MAX/(C6/C1)); }
        public long toMillis(long d)  { return x(d, C6/C2, MAX/(C6/C2)); }
        public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }
        public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }
        public long toHours(long d)   { return x(d, C6/C5, MAX/(C6/C5)); }
        public long toDays(long d)    { return d; }
        public long convert(long d, TimeUnit u) { return u.toDays(d); }
        int excessNanos(long d, long m) { return 0; }
    };

    // Handy constants for conversion methods
    static final long C0 = 1L;
    static final long C1 = C0 * 1000L;
    static final long C2 = C1 * 1000L;
    static final long C3 = C2 * 1000L;
    static final long C4 = C3 * 60L;
    static final long C5 = C4 * 60L;
    static final long C6 = C5 * 24L;

    static final long MAX = Long.MAX_VALUE;

    static long x(long d, long m, long over) {
        if (d >  over) return Long.MAX_VALUE;
        if (d < -over) return Long.MIN_VALUE;
        return d * m;
    }

    public long convert(long sourceDuration, TimeUnit sourceUnit) {
        throw new AbstractMethodError();
    }

    public long toNanos(long duration) {
        throw new AbstractMethodError();
    }

    public long toMicros(long duration) {
        throw new AbstractMethodError();
    }
    
    public long toMillis(long duration) {
        throw new AbstractMethodError();
    }

    public long toSeconds(long duration) {
        throw new AbstractMethodError();
    }

    public long toMinutes(long duration) {
        throw new AbstractMethodError();
    }

    public long toHours(long duration) {
        throw new AbstractMethodError();
    }

    public long toDays(long duration) {
        throw new AbstractMethodError();
    }

    abstract int excessNanos(long d, long m);
    
    public void timedWait(Object obj, long timeout)
            throws InterruptedException {
        if (timeout > 0) {
            long ms = toMillis(timeout);
            int ns = excessNanos(timeout, ms);
            obj.wait(ms, ns);
        }
    }

    public void timedJoin(Thread thread, long timeout)
            throws InterruptedException {
        if (timeout > 0) {
            long ms = toMillis(timeout);
            int ns = excessNanos(timeout, ms);
            thread.join(ms, ns);
        }
    }
    
    public void sleep(long timeout) throws InterruptedException {
        if (timeout > 0) {
            long ms = toMillis(timeout);
            int ns = excessNanos(timeout, ms);
            Thread.sleep(ms, ns);
        }
    }

}

TimeUnit 表示給定單元粒度的時間段,它提供在這些單元中進行跨單元轉換和執行計時及延遲操作的實用工具方法。

TimeUnit 不維護時間信息,但是有助於組織和使用可能跨各種上下文單獨維護的時間表示形式。
TimeUnit 主要用於通知基於時間的方法如何解釋給定的計時參數

部分使用可以參見rt.jar:java.util.concurrent.locks.ReentrantLock

例如,如果 lock 不可用,則以下代碼將在 50 毫秒後超時:
  Lock lock = ...;
  if ( lock.tryLock(50L, TimeUnit.MILLISECONDS) ) ...

 而以下代碼將在 50 秒後超時:
  Lock lock = ...;
  if ( lock.tryLock(50L, TimeUnit.SECONDS) ) ...

但是注意,不保證特定超時實現能夠以與給定 TimeUnit 相同的粒度通知 段。
枚舉常量摘要
MICROSECONDS    微秒   一百萬分之一秒(就是毫秒/1000)
MILLISECONDS    毫秒   千分之一秒    
NANOSECONDS   毫微秒  十億分之一秒(就是微秒/1000)
SECONDS          秒
MINUTES     分鐘
HOURS      小時
DAYS      天
主要接口
 long  convert(long duration, TimeUnit unit) 將給定單元的時間段轉換到此單元。
 void  sleep(long timeout) 使用此單元執行 Thread.sleep.這是將時間參數轉換爲 Thread.sleep 方法所需格式的便捷方法。
 void  timedJoin(Thread thread, long timeout)  使用此時間單元執行計時的 Thread.join。
 void  timedWait(Object obj, long timeout) 使用此時間單元執行計時的 Object.wait。
 long  toMicros(long duration) 等效於 MICROSECONDS.convert(duration, this)。
 long  toMillis(long duration) 等效於 MILLISECONDS.convert(duration, this)。
 long  toNanos(long duration) 等效於 NANOSECONDS.convert(duration, this)。
 long  toSeconds(long duration) 等效於 SECONDS.convert(duration, this)。
static TimeUnit  valueOf(String name) 返回帶有指定名稱的該類型的枚舉常量。
static TimeUnit[]  values() 按照聲明該枚舉類型的常量的順序,返回包含這些常量的數組。
注意1:它的常量MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS都是TimeUnit類型
注意2
:convert(long duration, TimeUnit unit)的意思將duration這個時間轉化爲本對象(this)所表示的時間形式。
本對象可能MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS的一種。
至於duration是哪種形式的時間(MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS的一種), 則是通過參數TimeUnit unit來確定的

注意3TimeUnit是enum(枚舉)類型,不能通過外部來實例化
對用戶來說只有它內部定義的下常量可用:MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS,MINUTES,HOURS,DAYS
注意4:對於常量MINUTES,HOURS,DAYS,在Java1.5和Android中並沒看到,但是在Java1.6中卻有。
注意5:關於枚舉類型的知識可參加《枚舉類型

下面一個小demo列出其中的轉換<convert>情況

public class AppTest  extends TestCase {
	public static void main(String[] args) {
		long nanoTime = System.nanoTime();
		System.out.println("nanoTime原身:"+nanoTime);
		System.out.println("NANOSECONDS轉MICROSECONDS:"+TimeUnit.MICROSECONDS.convert(nanoTime,TimeUnit.NANOSECONDS));
		System.out.println("MILLISECONDS轉MICROSECONDS:"+TimeUnit.MICROSECONDS.convert(nanoTime, TimeUnit.MILLISECONDS));
		System.out.println("NANOSECONDS轉MILLISECONDS:"+TimeUnit.MILLISECONDS.convert(nanoTime,TimeUnit.NANOSECONDS));
		System.out.println("MILLISECONDS轉NANOSECONDS:"+TimeUnit.NANOSECONDS.convert(nanoTime, TimeUnit.MILLISECONDS));
	}
}
nanoTime原身:187408555452023
NANOSECONDS轉MICROSECONDS:187408555452
MILLISECONDS轉MICROSECONDS:187408555452023000
NANOSECONDS轉MILLISECONDS:187408555
MILLISECONDS轉NANOSECONDS:9223372036854775807


發佈了102 篇原創文章 · 獲贊 220 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章