TimeUnit详解

    时间工具类, 应该说时间段工具类, 提供不同粒度之间的转换及延时功能(重写了Object的sleep()函数) 
    是一个枚举类型,其中有枚举实例:NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS且这几个实例都实现了toNanos(),toMicros(),toMillis(),toSeconds(),toMinutes(),toHours(),convert().意思应该不难理解吧,这个类里面通过定义几个常量C0,C1,C2,C3,C4,C5,C6来实现不同粒度时间段的转换。当然,除了这几个函数在TimeUnit的各个实例中有不同的实现,TimeUnit还有几个具有相同实现的方法,timeJoin(Thread t,long time),timeWait(Object obj, long timeout),sleep() 好吧,上面的几个函数你可能对convert()有些疑问,其实她很简单,其原型为public long convert(long d, TimeUnit u) { return u.toMicros(d); } 当然,我给的是实例的,意思就是 把你现在实例的时间段d时间粒度转换为u所对应的时间粒度, 简单的举个栗子:假如你调用MICROSECONDS.convert(1000L,MILLISECONDS);那你的意思说白了就是把微秒转换成毫秒。至于timeWait(),timeJoin(),sleep()很简单,就是调用了Object的wait(long t),sleep()和Thread.join(long t),下面详细讲一下sleep()(其实他们三个的调用规则一样)
    其实我们要说一下其中的sleep()方法,这个在非实例TimeUnit中就已经实现了,这说明他是个非abstract函数,但是你却不能直接通过TimeUnit调用他,如果直接调用会出现AbstractMethordExcepthion,恩,就是这样,因为在他里面调用了excessNanos(d,m),excessNanos又是干什么的?好像什么都没干!因为在TimeUnit的几个实例中这个函数都是return 0;但是sleep()函数确实调用了,所以你必须通过TimeUnit的实例调用他才不会报错。那么他是干啥的,其实他就是调用了Object.sleep(), 实现线程休眠。
    下次有跟时间间隔粒度转换的时候要记得用它。当然它自带实现线程休眠,等待,和线程任务组织而且它提供了更精准的时间间隔控制,为什么不用他呢?!

你可能感兴趣的:(并发编程)