版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQB67G8COM/article/details/89714634
(JDK1.8下)的java.util.concurrent.TimeUnit:
TimeUint用来进行时间粒度转换和进行线程延时,通常用来替代Thread.sleep(),提高时间的可读性.
文档解释:
TimeUnit 表示给定单元粒度的时间段,它提供在这些单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。TimeUnit 不维护时间信息,但是有助于组织和使用可能跨各种上下文单独维护的时间表示形式。毫微秒定义为千分之一微秒,微秒为千分之一毫秒,毫秒为千分之一秒,一分钟为六十秒,一小时为六十分钟,一天为二十四小时。
时间颗粒度
TimeUnit.DAYS //天
TimeUnit.HOURS //时
TimeUnit.MINUTES //分
TimeUnit.SECONDS //秒
TimeUnit.MILLISECONDS //毫秒
TimeUnit.MICROSECONDS //微秒
TimeUnit.NANOSECONDS //纳秒
全API实例解析:
import java.util.concurrent.TimeUnit;
public class TimeUinitTest {
public static void main(String[] args) throws InterruptedException {
TimeUinitTest tut = new TimeUinitTest();
//tut.secondUnit();
tut.dayUnit();
}
//看看TimeUint怎么替代Thread的某些方法干活的?
public void secondUnit() throws InterruptedException {
System.out.println("--Seconds--");
TimeUnit unit = TimeUnit.SECONDS; //设定时间单位
//使用此时间单位执行 Thread.sleep
unit.sleep(5); //线程睡眠5秒,替代Thread.sleep(5000)
//使用此时间单位执行定时 Thread.join
//挂起当前线程,直到被调用的线程(Thread.currentThread())执行5秒后继续执行
unit.timedJoin(Thread.currentThread(), 5);
//使用此时间单位执行定时的 Object.wait,需要和notify配合同步锁使用
final Boolean lock = new Boolean(false);
synchronized (lock) {
//下面一行会抛出非法监视器状态异常,因为已经改变了锁的状态导致锁被
//释放,这也是为什么在多线程中的某些共享对象需要使用final来标识,不用final
//时程序正确时运行没问题,谁知道什么时候不小心把对象给修改了导致对象引
//用发生改变导致锁释放而引发的班长这个监视器状态出了问题
//IllegalMonitorStateException:非法监视器(班长)状态异常
//lock=true;
unit.timedWait(lock, 5); //等待5秒如果没有接收到notify就不等了
}
}
/**
* 以天为颗粒单位进行时间粒度转换
*/
public void dayUnit() {
System.out.println("--Days--");
TimeUnit unit = TimeUnit.DAYS;
System.out.println(unit.toDays(1L)); //1day->1day
System.out.println(unit.toHours(1L)); //1day->24hours
System.out.println(unit.toMinutes(1L)); //转化为分钟
System.out.println(unit.toSeconds(1L)); //转化为秒
System.out.println(unit.toMillis(1L)); //转化为毫秒
System.out.println(unit.toMicros(1L)); //转化为微秒
System.out.println(unit.toNanos(1L)); //转化为纳秒,10亿份之一秒
System.out.println(unit.name()); //返回枚举常量
System.out.println(unit.convert(24L, TimeUnit.HOURS));//使转换...TimeUnit.HOURS的数据转换为DAYS
//按照它们声明的顺序返回一个包含此枚举类型常量的数组
for(TimeUnit c : TimeUnit.values()) {
System.out.print(c+" ");
}
System.out.println();
//以指定的名称返回此类型的枚举常量。
//字符串必须完全匹配用于声明此类型的枚举常量的标识符。 (不允许使用外来空白字符。)
TimeUnit unit2 = TimeUnit.valueOf("DAYS");//NANOSECONDS MICROSECONDS MILLISECONDS SECONDS MINUTES HOURS DAYS
System.out.println(unit2.name());
}
}
Console:
–Days–
1
24
1440
86400
86400000
86400000000
86400000000000
DAYS
1
NANOSECONDS MICROSECONDS MILLISECONDS SECONDS MINUTES HOURS DAYS
DAYS