JUC TimeUnit深入

TimeUnit是什么?

JUC的一部分,表示给定粒度单位的持续时间,并提供实用方法以跨单位进行转换,并在这些单位中执行计时和延迟操作。

包含的时间单位

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

时间单位之间的转化

  • 1000 * NANOSECONDS(纳秒) = 1 * MICROSECONDS(微秒)
  • 1000 * MICROSECONDS(微秒) = 1 * MILLISECONDS(毫秒)
  • 1000 * MILLISECONDS(毫秒) = 1 * SECONDS(秒)
  • 60 * SECONDS(秒) = 1 * MINUTES(分)
  • 60 * MINUTES(分) = 1 * HOURS(时)
  • 24 * HOURS(时) = 1 * DAYS(天)

包含的方法

  1. public long convert(long sourceDuration, TimeUnit sourceUnit)
    convert源码
  • sourceDuration:指的是需要转化的时间量
  • sourceUnit:指的是需要转化的时间单位

这边的方法在每个枚举中都有相应的实现,最终会将传入的时间转换成方法调用的单位。
例如TimeUnit.SECONDS.convert(1, TimeUnit.HOURS),此方法就是将「1小时」转为以秒为单位,所以结果为3600

  1. public long toNanos(long duration)
    toNanos源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以纳秒为单位的数值。
例如TimeUnit.MICROSECONDS.toNanos(1),将1微秒转为纳秒为单位,所以结果为1000

  1. public long toMicros(long duration)
    toMicros源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以微秒为单位的数值。
例如TimeUnit.MILLISECONDS.toMicros(1),将1毫秒转为微秒为单位,所以结果为1000

  1. public long toMillis(long duration)
    toMillis源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以毫秒为单位的数值。
例如TimeUnit.SECONDS.toMillis(1),将1秒转为微秒为单位,所以结果为1000

  1. public long toSeconds(long duration)
    toSeconds源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以秒为单位的数值。
例如TimeUnit.MINUTES.toSeconds(1),将1分钟转为秒为单位,所以结果为60

  1. public long toMinutes(long duration)
    toMinutes源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以分钟为单位的数值。
例如TimeUnit.HOURS.toMinutes(1),将1小时转为分钟为单位,所以结果为60

  1. public long toHours(long duration
    toHours源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以小时为单位的数值。
例如TimeUnit.DAYS.toHours(1),将1天转为小时为单位,所以结果为24

  1. public long toDays(long duration)
    toDays源码
  • duration:指的是时间量(单位取决于调用方)

此方法是将duration转为以天为单位的数值。
例如TimeUnit.HOURS.toDays(48),将48小时转为天为单位,所以结果为2

  1. abstract int excessNanos(long d, long m)
    excessNanos源码
  • d:指的是时间量(单位取决于调用方)
  • m:指的是毫秒数

取得时间量(单位取决于调用方)的纳秒数
使用场景:TimeUnit#timedWait

  1. public void timedWait(Object obj, long timeout)
    timedWait源码
  • obj:要超时等待的对象
  • timeout:超时时间

timedWait原理(本质上就是Object.wait()):

  1. 获取毫秒数
  2. 获取纳秒数
  3. obj.wait()


    wait源码

    wait源码

等待阻塞时底层调用的是Object.wait,而这个wait的超时时间最小支持ns级。所以在调用的时候取得纳秒数,如果999999>纳秒数>0,那么就多等待1ms。

  1. public void timedJoin(Thread thread, long timeout)
    timedJoin源码
  • thread:需要join的线程
  • timeout:超时时间

同理timedWait,同样是调用Thread.join(),同样最小支持ns级

join源码
  1. public void sleep(long timeout)
    sleep源码
  • timeout:超时时间

同理timedWait,同样是调用Thread.join(),同样最小支持ns级

sleep源码

为啥TimeUnit要对sleepwait额外封装呢?

首先来看看如何使用?

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            // do something

            try {
                // 1. 使用TimeUnit睡眠2s
                TimeUnit.SECONDS.sleep(2);
                // 2. 使用Thread.sleep()
                Thread.sleep(2 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

从以上的代码可以很明显地看出,使用TimeUnit的方式会更加的简洁且语义明确。

使用的场景

  1. 所有需要对时间进行单位之间的转化action或者是有使用时间的场景,例如:reentrantLock.tryLock(1, TimeUnit.SECONDS);
  2. sleep()wait()join()相关的操作,使用TimeUnit的封装方法可使得程序更加可读。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容