1. TimeUnit枚举
-
java.utils.concurrent.TimeUnit 是Java枚举应用场景中最好的例子之一
-
枚举指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS(毫秒)、NANOSECONDS(纳妙)
2. 可读性
-
使用TimeUnit代替传统Thread.sleep()将当前线程暂停
// 睡眠毫秒数,可读性非常差,不知道方法单位的情况下无法分辨 Thread.sleep(2400000); // 使用TimeUnit的枚举非常容易分辨是睡眠4分钟 TimeUnit.MINUTES.sleep(4);
3. 转换时间单位
- 时间转换的两种方式
TimeUnit.SECONDS.toMillis(1) 1秒转换为毫秒数
TimeUnit.SECONDS.toMinutes(60) 60秒转换为分钟数
TimeUnit.SECONDS.toMicros(1) 1秒转换为微秒数(1毫秒 = 1000微妙)
TimeUnit.SECONDS.toNanos(1) 1秒转换为纳秒数 (1微妙 = 1000纳秒)
TimeUnit.SECONDS..convert(1, TimeUnit.HOURS) 1小时转换为秒数
TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES) 1分钟转换为秒数
TimeUnit.SECONDS.convert(1, TimeUnit.DAYS) 1天转换为秒数
4. 锁超时判断原理
// 预设等待时间(2秒)
TimeUnit seconds = TimeUnit.SECONDS;
long nanosTimeout = seconds.toNanos(2);
// 超时时间 = 当前时间(纳秒) + 预设等待时间(纳秒)
final long deadline = System.nanoTime() + nanosTimeout;
// 是否超时 = 超时时间 - 当前时间
nanosTimeout = deadline - System.nanoTime();
if (nanosTimeout <= 0L)
return false;