`
lantian_123
  • 浏览: 1360202 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一些实用类

    博客分类:
  • Java
阅读更多

1、TimeUnit

TimeUnit出现在concurrent包中,但它实实在在是一个util类(实用的工具类),严格来说TimeUnit是一个enum类型,包含的常量从NANOSENDS到DAYS共七个。其目的就是从Thread类中的sleep方法中的毫秒参数解脱出来,首先举个例子小试牛刀

 

public class TimeUnitTest {
	
	public static void main(String[] args) throws InterruptedException {
		Thread.sleep(1000*10);
		System.out.println("原始的线程睡眠方式");
		
		TimeUnit.SECONDS.sleep(10);
		System.out.println("一种更方便的方法");
		
	}
}
 

 

再来来看看源码:

 

 

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

 sleep接收的是一个long型的参数,很明显他是以当前对象为单位的一个长整形值。不管是以DAYS,还是HOURS等其他对象为单位,timeout最终都会转换为Thread.sleep所要求的毫秒和纳秒为单位的参数。我们来看看TimeUnit的toMillis是怎么实现的

 

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

 咋一看就只抛出了一个异常,显然如何使得该方法可用它的子类或者说匿名子类回去继承该方法,我们以Days为例,它的实现方式

 

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

 其中x方法是一个转换函数。读者也可以跟进TimeUnit的源码做一个更详细的了解。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics