Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用

Posted xkzhangsanx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用相关的知识,希望对你有一定的参考价值。

TimeUnit是一个时间单位枚举类,主要用于并发编程,时间单元表示给定粒度单元的时间持续时间,并提供实用程序方法来跨单元转换,以及在这些单元中执行计时和延迟操作。

1.时间单位换算

(1)支持的单位

TimeUnit.DAYS          //
TimeUnit.HOURS         //小时
TimeUnit.MINUTES       //分钟
TimeUnit.SECONDS       //
TimeUnit.MILLISECONDS  //毫秒
TimeUnit.MICROSECONDS  //微秒
TimeUnit.NANOSECONDS  //纳秒

(2)转换方法,例如:TimeUnit.HOURS 的转换源码

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

(3)使用举例

//小时转换为秒
long sec = TimeUnit.HOURS.toSeconds(1);
System.out.println("sec:" + sec);

// 另一种形式
long sec2 = TimeUnit.SECONDS.convert(1, TimeUnit.HOURS);
System.out.println("sec2:" + sec2);

输出结果:

sec:3600
sec2:3600

 

2.计时操作

(1)例如:尝试获取锁50毫秒

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

 

3.延迟操作

(1)比如当前线程延迟5s

TimeUnit.SECONDS.sleep(5);

 

4.TimeUnit 与 Thread sleep的区别

(1)TimeUnit 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 sleep的底层调用了Thread.sleep。

(2)区别:TimeUnit sleep使用起来更方便,更易懂

比如:比如当前线程延迟5s:

使用Thread.sleep

Thread.sleep(5000);
// 或者
Thread.sleep(5*1000);

使用TimeUnit

TimeUnit.SECONDS.sleep(5);

以上是关于Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用的主要内容,如果未能解决你的问题,请参考以下文章

Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

Java日期时间API系列20-----Jdk8中java.time包中的新的日期时间API类,ZoneId时区ID大全等。

Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

Java日期时间API系列33-----Jdk8中java.time包中的新的日期时间API类应用,格式化常用模板大全,新增Excel常用格式。