TimeUnit类详解

简介: TimeUnit类详解

其类作者Doug Lea在其javadoc中写道:

A TimeUnit represents time durations at a given unit of granularity and provides utility methods to convert across units, and to perform timing and delay operations in these units. A TimeUnit does not maintain time information, but only helps organize and use time representations that may be maintained separately across various contexts. A nanosecond is defined as one thousandth of a microsecond, a microsecond as one thousandth of a millisecond, a millisecond as one thousandth of a second, a minute as sixty seconds, an hour as sixty minutes, and a day as twenty four hours.

解释:
TimeUnit表示给定粒度单位的持续时间,
常见的颗粒度有:
在这里插入图片描述

  • NANOSECONDS 纳秒
  • MICROSECONDS 微秒
  • MILLISECONDS 毫秒
  • SECONDS 秒
  • MINUTES 分
  • HOURS 时
  • DAYS 天

并提供跨单位转换以及在这些单位中执行计时和延迟操作的实用方法。时间单位不维护时间信息,只帮助组织和使用可以在不同上下文中单独维护的时间表示。纳秒定义为千分之一微秒,微秒定义为千分之一毫秒,毫秒定义为千分之一秒,分钟定义为六十秒,小时定义为六十分钟,一天定义为二十四小时。

其中以纳秒举例,如下:

在这里插入图片描述
方法中用的属性定义如下:
在这里插入图片描述

NANOSECONDS {
    
        public long toNanos(long d)   {
     return d; }   // 转换成纳秒
        public long toMicros(long d)  {
     return d/(C1/C0); }   // 转换成微秒
        public long toMillis(long d)  {
     return d/(C2/C0); }      // 转换成毫秒
        public long toSeconds(long d) {
     return d/(C3/C0); }      // 转换成秒
        public long toMinutes(long d) {
     return d/(C4/C0); }      // 转换成分
        public long toHours(long d)   {
     return d/(C5/C0); }      // 转换成时
        public long toDays(long d)    {
     return d/(C6/C0); }      // 转换成天
        // 例如,要将10分钟转换为纳秒,请使用:TimeUnit.NANOSECONDS.convert(10L, TimeUnit.MINUTES)
        // 参数:
        // d–给定源单元中的持续时间
        // u–d参数的单位(参数可以为如下类型:
        //                NANOSECONDS 纳秒、
        //                 MICROSECONDS 微秒、
        //                 MILLISECONDS 毫秒、
        //                 SECONDS 秒、
        //                 MINUTES 分、
        //                 HOURS 时、
        //                 DAYS 天)
        // 返回:
        // 此单位中转换的持续时间,如果转换将负溢出,则为Long.MIN_VALUE;如果转换将正溢出,则为Long.MAX_VALUE。
        public long convert(long d, TimeUnit u) {
     return u.toNanos(d); }
        // 用于计算等待、睡眠和加入的多余纳秒参数的实用程序。
        // 参数:
        // d–持续时间
        // m–毫秒数
        // 返回:
        // 纳秒数
        int excessNanos(long d, long m) {
     return (int)(d - (m*C2)); } 
    },
AI 代码解读

其中注意在使用convert方法的时候,将给定单位中的给定持续时间转换为此单位。从细粒度到粗粒度的转换会截断,因此会失去精度。例如,将999毫秒转换为秒将导致0。从粗粒度到细粒度的转换,参数在数值上会溢出,如果为负,则饱和为Long.MIN_VALUE;如果为正,则饱和为Long.MAX_VALUE。
同时上例中将10分钟转换为纳秒,也可以使用另外一种方法,在对应的枚举类对象中,直接调用转换方法,如下:

TimeUnit.MINUTES.toNanos( 10 );
AI 代码解读

对于excessNanos,其中颗粒度为纳秒、微秒对于该重写方法有具体的逻辑计算,颗粒度为毫秒、秒、分、时、天中该重写方法就都返回0了。
还有一个static long x(long d, long m, long over)方法如下:

static long x(long d, long m, long over) {
      
        if (d >  over) return Long.MAX_VALUE;
        if (d < -over) return Long.MIN_VALUE;
        return d * m;
    }
AI 代码解读

该方法是用来检查从粗粒度到细粒度的转换,参数在数值上是否会溢出(参数在数值上会溢出,如果为负,则饱和为Long.MIN_VALUE;如果为正,则饱和为Long.MAX_VALUE),没有溢出就取正常值。
比如枚举对象MICROSECONDS对于toNanos的重写方法如下,该方法的作用是把微秒转为为纳秒,其方法内部就调用了x()进行检查是否溢出,如下:
在这里插入图片描述

当然TimeUnit类中还有枚举对象没用重写的方法,如下:

timedWait
其内部还是调用了Object对象的wait()方法,只是转换为了对应的颗粒度,增加了可读性timedJoin
其内部还是调用了Thread对象的join()方法,只是转换为了对应的颗粒度,增加了可读性sleep
其内部还是调用了Thread类的sleep()方法,只是转换为了对应的颗粒度,增加了可读性

举例:

// 没有用TimeUnit类
public static void main(String[] args) {
       
 
        new Thread( new Runnable() {
       
 
            @Override
            public void run() {
       
                try {
       
                    Thread.sleep( 5 * 60 * 1000 );
                    System.out.println( "延时完成了");
                } catch (InterruptedException e) {
       
                    e.printStackTrace();
                }
            }
        }).start();  ;
    }

//用了TimeUnit类
public static void main(String[] args) {
       
 
        new Thread( new Runnable() {
       
 
            @Override
            public void run() {
       
                try {
       
                    TimeUnit.MINUTES.sleep( 5 );
                    System.out.println( "延时5分钟,完成了");
                } catch (InterruptedException e) {
       
                    e.printStackTrace();
                }
            }
        }).start();  ;
    }
AI 代码解读

可以看到延时五分钟的时候,有了TimeUnit类,我们不用再去进行时间的转换运算,Thread.sleep( 5 * 60 * 1000 );直接调用TimeUnit.MINUTES.sleep( 5 );即可,极大的增加了我们写代码的便捷性和可阅读性。

已完结
于2021.11.24 著
author:YuShiwen
相关文章
微信小程序怎么获取后台接口,报不在以下 request 合法域名列表中怎么办。
微信小程序怎么获取后台接口,报不在以下 request 合法域名列表中怎么办。
338 0
创建slb实例
在阿里云上创建SLB实例涉及登录控制台、进入SLB服务、创建实例(选择网络类型、设置实例信息、配置监听规则)、关联后端ECS实例及确认创建。确保SLB与ECS在同一地域和可用区,以降低延迟。实际操作请参照最新控制台界面,并考虑可能需配置的额外功能,如证书管理和安全策略。
212 6
生成AI的两大范式:扩散模型与Flow Matching的理论基础与技术比较
本文系统对比了扩散模型与Flow Matching两种生成模型技术。扩散模型通过逐步添加噪声再逆转过程生成数据,类比为沙堡的侵蚀与重建;Flow Matching构建分布间连续路径的速度场,如同矢量导航系统。两者在数学原理、训练动态及应用上各有优劣:扩散模型适合复杂数据,Flow Matching采样效率更高。文章结合实例解析两者的差异与联系,并探讨其在图像、音频等领域的实际应用,为生成建模提供了全面视角。
373 1
生成AI的两大范式:扩散模型与Flow Matching的理论基础与技术比较
AI大模型都有的“幻觉病”,企业AI应用创新路上须警惕
法思诺创新提醒:AI大模型虽强大,但其“幻觉病”不容忽视。文章剖析了AI生成错误信息的现象及其成因,包括数据质量问题、缺乏常识理解及追求流畅度的倾向,并警示企业在医疗、法律、金融等关键领域应用AI时需警惕潜在风险。为应对挑战,应通过技术改进、人机协同和伦理规范三重手段约束AI行为,同时强调企业应以人为主导,将AI作为辅助工具,在享受技术便利的同时有效控制风险。
150 0
扩散模型
本文详细介绍了扩散模型(Diffusion Models, DM),一种在计算机视觉和自然语言处理等领域取得显著进展的生成模型。文章分为四部分:基本原理、处理过程、应用和代码实战。首先,阐述了扩散模型的两个核心过程:前向扩散(加噪)和逆向扩散(去噪)。接着,介绍了训练和生成的具体步骤。最后,展示了模型在图像生成、视频生成和自然语言处理等领域的广泛应用,并提供了一个基于Python和PyTorch的代码示例,帮助读者快速入门。
Java中的单例模式:理解与实践
【8月更文挑战第31天】在软件设计中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨Java中实现单例模式的不同方法,包括懒汉式、饿汉式、双重校验锁以及静态内部类等方法。每种方法都有其适用场景和潜在问题,我们将通过代码示例来展示如何根据具体需求选择合适的实现方式。
阿粉带你彻底解决开发中对象Bean与Map互转问题!
在实际开发过程中,经常碰到需要进行对象与map之间互转的问题,其实对于对象、Map 之间进行互转有很多种方式,下面我们一起来梳理一下:
1448 0
阿粉带你彻底解决开发中对象Bean与Map互转问题!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问