1. 程式人生 > >java.util.concurrent.TimeUnit 列舉 原始碼

java.util.concurrent.TimeUnit 列舉 原始碼

執行緒池相關

原始碼:

package java.util.concurrent;

public enum TimeUnit {

    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)); }
    },

    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)); }
    },

    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; }
    },

    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; }
    },

    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; }
    },

    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; }
    },

    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; }
    };

    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

所有已實現的介面:

    SerializableComparableTimeUnit>

    TimeUnit 表示給定單元粒度的時間段,它提供在這些單元中進行跨單元轉換和執行計時及延遲操作的實用工具方法。TimeUnit 不維護時間資訊,但是有助於組織和使用可能跨各種上下文單獨維護的時間表示形式。毫微秒定義為千分之一微秒,微秒為千分之一毫秒,毫秒為千分之一秒,一分鐘為六十秒,一小時為六十分鐘,一天為二十四小時。

    TimeUnit 主要用於通知基於時間的方法如何解釋給定的計時引數。例如,如果 lock 不可用,則以下程式碼將在 50 毫秒後超時:

  Lock lock = ...;
  if ( lock.tryLock(50L, TimeUnit.MILLISECONDS) ) ...

    而以下程式碼將在 50 秒後超時:

  Lock lock = ...;
  if ( lock.tryLock(50L, TimeUnit.SECONDS) ) ...

 

列舉常量摘要
DAYS 
           
HOURS 
           
MICROSECONDS 
           
MILLISECONDS 
           
MINUTES 
           
NANOSECONDS 
           
SECONDS 
           

 

方法摘要

 long convert(long sourceDuration, TimeUnit sourceUnit) 
          將給定單元的時間段轉換到此單元。
 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 toDays(long duration) 
          等效於 DAYS.convert(duration, this)。
 long toHours(long duration) 
          等效於 HOURS.convert(duration, this)。
 long toMicros(long duration) 
          等效於 MICROSECONDS.convert(duration, this)。
 long toMillis(long duration) 
          等效於 MILLISECONDS.convert(duration, this)。
 long toMinutes(long duration) 
          等效於 MINUTES.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() 
          Returns an array containing the constants of this enum type, in the order they are declared.

 從類 java.lang.Enum 繼承的方法

    clonecompareToequalsfinalizegetDeclaringClasshashCodenameordinaltoStringvalueOf

從類 java.lang.Object 繼承的方法

    getClassnotifynotifyAllwaitwaitwait

 

列舉常量

  • NANOSECONDS
  • MICROSECONDS
  • MILLISECONDS
  • SECONDS
  • MINUTES
  • HOURS
  • DAYS

 

values

public static final TimeUnit[] values()

    返回包含該列舉型別的常量的陣列,按照它們宣告的順序。此方法可用於迭代常數,如下所示:

for(TimeUnit c : TimeUnit.values())
        System.out.println(c);

 

valueOf

public static TimeUnit valueOf(String name)

    返回帶有指定名稱的該型別的列舉常量。 字串必須與用於宣告該型別的列舉常量的 識別符號 完全匹配。(不允許有多餘 的空格。)

    引數:

    指定要返回的列舉常量的名稱。

    返回:

    返回帶有指定名稱的列舉常量

    丟擲:

    如果該列舉型別沒有帶有指定名稱的常量, - 則丟擲 IllegalArgumentException

 

convert

public long convert(long sourceDuration,
                    TimeUnit sourceUnit)

    將給定單元的時間段轉換到此單元。從較細粒度到較粗粒度的舍位轉換,這樣會失去精確性。例如,將 999 毫秒轉換為秒的結果為 0。使用引數從較粗粒度到較細粒度轉換,如果引數為負,則在數字上溢位至Long.MIN_VALUE,如果為正,則為 Long.MAX_VALUE。

    例如,要將 10 分鐘轉換為毫秒,請使用:TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES)

    引數:

    sourceDuration - 給定 sourceUnit 中的時間段

    sourceUnit - sourceDuration 引數的單元

    返回:

    此單元中的轉換時間段;如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

 

toNanos

public long toNanos(long duration)

    等效於 NANOSECONDS.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

        轉換時間段,如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

toMicros

public long toMicros(long duration)

    等效於 MICROSECONDS.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

        轉換時間段,如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

toMillis

public long toMillis(long duration)

    等效於 MILLISECONDS.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

        轉換時間段,如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

toSeconds

public long toSeconds(long duration)

    等效於 SECONDS.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

        轉換時間段;如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

toMinutes

public long toMinutes(long duration)

    等效於 MINUTES.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

        轉換時間段;如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

toHours

public long toHours(long duration)

    等效於 HOURS.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

        轉換時間段;如果轉換將負溢位,則返回 Long.MIN_VALUE;如果轉換將正溢位,則返回 Long.MAX_VALUE。

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

toDays

public long toDays(long duration)

    等效於 DAYS.convert(duration, this)。

    引數:

    duration - 時間段

    返回:

    轉換時間段

    另請參見:

    convert(long, java.util.concurrent.TimeUnit)

 

timedWait

public void timedWait(Object obj,
                      long timeout)
               throws InterruptedException

    使用此時間單元執行計時的 Object.wait。這是將超時引數轉換為 Object.wait 方法所需格式的便捷方法。

    例如,可以使用以下程式碼實現阻塞 poll 方法(參見 BlockingQueue.poll):

  public synchronized  Object poll(long timeout, TimeUnit unit) throws InterruptedException {
    while (empty) {
      unit.timedWait(this, timeout);
      ...
    }
  }

    引數:

    obj - 要等待的物件

    timeout - 要等待的最長時間。如果小於等於 0,則根本不會等待。

    丟擲:

    InterruptedException - 如果等待時中斷。

    另請參見:

    Object.wait(long, int)

 

timedJoin

public void timedJoin(Thread thread,
                      long timeout)
               throws InterruptedException

    使用此時間單元執行計時的 Thread.join。這是將時間引數轉換為 Thread.join 方法所需格式的便捷方法。

    引數:

    thread - 要等待的執行緒

    timeout - 要等待的最長時間。如果小於等於 0,則根本不會等待。

    丟擲:

    InterruptedException - 如果等待時中斷。

    另請參見:

    Thread.join(long, int)

 

sleep

public void sleep(long timeout)
           throws InterruptedException

使用此單元執行 Thread.sleep.這是將時間引數轉換為 Thread.sleep 方法所需格式的便捷方法。

    引數:

    timeout - 休眠的最短時間。如果小於等於 0,則根本不會休眠。

    丟擲:

    InterruptedException - 如果休眠時中斷。

    另請參見:

    Thread.sleep(long)