java.util.concurrent.TimeUnit 枚举 源码

线程池相关

源码:
package java.util.concurrent;

public enum TimeUnit {
    //1纳秒
    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)); }
    },

    //1微秒
    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)); }
    },

    //1毫秒
    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; }
    },

   //1秒
    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; }
    },

   //1分钟
    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; }
    },

   //1小时
    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; }
    },

    //1天
    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;//1纳秒
    static final long C1 = C0 * 1000L;//1微秒
    static final long C2 = C1 * 1000L;//1毫秒
    static final long C3 = C2 * 1000L;//1秒
    static final long C4 = C3 * 60L;//1分
    static final long C5 = C4 * 60L;//1小时
    static final long C6 = C5 * 24L;//1天

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

    abstract int excessNanos(long d, long m);

    //将给定单元的时间段转换到此单元
    public long convert(long sourceDuration, TimeUnit sourceUnit) {
        throw new AbstractMethodError();
    }

    //等效于 NANOSECONDS.convert(duration, this)
    public long toNanos(long duration) {
        throw new AbstractMethodError();
    }

    //等效于 MICROSECONDS.convert(duration, this)
    public long toMicros(long duration) {
        throw new AbstractMethodError();
    }

    //等效于 MILLISECONDS.convert(duration, this)
    public long toMillis(long duration) {
        throw new AbstractMethodError();
    }

    //等效于 SECONDS.convert(duration, this)
    public long toSeconds(long duration) {
        throw new AbstractMethodError();
    }

    //等效于 MINUTES.convert(duration, this)
    public long toMinutes(long duration) {
        throw new AbstractMethodError();
    }

    //等效于 HOURS.convert(duration, this)
    public long toHours(long duration) {
        throw new AbstractMethodError();
    }

    //等效于 DAYS.convert(duration, this)
    public long toDays(long duration) {
        throw new AbstractMethodError();
    }

    //使用此时间单元执行计时的 Object.wait
    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);
        }
    }

    //使用此时间单元执行计时的 Thread.join
    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);
        }
    }

    //使用此单元执行 Thread.sleep.这是将时间参数转换为 Thread.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

所有已实现的接口:

    SerializableComparableTimeUnit>

    TimeUnit 表示给定单元粒度的时间段,它提供在这些单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。

    TimeUnit 不维护时间信息,但是有助于组织和使用可能跨各种上下文单独维护的时间表示形式。毫微秒定义为千分之一微秒,微秒为千分之一毫秒,毫秒为千分之一秒,一分钟为六十秒,一小时为六十分钟,一天为二十四小时。

    TimeUnit 主要用于通知基于时间的方法如何解释给定的计时参数。

    例如,对于lock内置锁,如果获取锁在指定时间50毫秒失败,则超时返回:

  Lock lock = ...;
  if (lock.tryLock(50L, TimeUnit.MILLISECONDS)){//获取锁成功
     ...//则执行
  }

 

 从类 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)

转载于:https://my.oschina.net/langwanghuangshifu/blog/2962031

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值