一些实用类
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的源码做一个更详细的了解。