TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它,事实上sleep方法本身也很常用而且出现在很多面试中。如果你已经使用过Thread.sleep(),当然我确信你这样做过,那么你一定熟知它是一个静态方法,暂停线程时它不会释放锁,该方法会抛出InterrupttedException异常(如果有线程中断了当前线程)。但是我们很多人并没有注意的一个潜在的问题就是它的可读性。Thread.sleep()是一个重载方法,可以接收长整型毫秒和长整型的纳秒参数,这样对程序员造成的一个问题就是很难知道到底当前线程是睡眠了多少秒、分、小时或者天。看看下面这个Thread.sleep()方法:

Thread.sleep(2400000)

粗略一看,你能计算出当前线程是等待多长时间吗?可能有些人可以,但是对于大多数程序员来说这种写法的可读性还是很差的,你需要把毫秒转换成秒和分,让我们来看看另外一个例子,这个例子比前面那个例子可读性稍微好一点:

Thread.sleep(4*60*1000);

这比前面那个例子已经好多了,但是仍然不是最好的,你注意到睡眠时间用毫秒,不容易猜出当前线程将等待4分钟。TimeUnit类解决了这个问题,通过指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS。java.utils.concurrent .TimeUnit 是Java枚举应用场景中最好的例子之一,所有TimeUnit都是枚举实例,让我们来看看线程睡眠4分钟用TimeUnit是如何使用的。

TimeUnit.MINUTES.sleep(4); //sleeping for 4 minutes

类似你可以采用秒、分、小时级别来暂停当前线程。你可以看到这比Thread的sleep方法的可读的好多了。记住TimeUnit.sleep()内部调用的Thread.sleep()也会抛出InterruptException。你也可以查看JDK源代码去验证一下。下面是一个简单例子,它展示如果使用TimeUnit.sleep()方法。

/***

* Java program to demonstrate how to use TimeUnit.sleep() method in Java.

* TimeUnit is a new way of introducing pause in Java program.

*@authorJavin*/

public classTimeUnitTest {public static void main(String args[]) throwsInterruptedException {

System.out.println("Sleeping for 4 minutes using Thread.sleep()");

Thread.sleep(4 * 60 * 1000);

System.out.println("Sleeping for 4 minutes using TimeUnit sleep()");

TimeUnit.SECONDS.sleep(4);

TimeUnit.MINUTES.sleep(4);

TimeUnit.HOURS.sleep(1);

TimeUnit.DAYS.sleep(1);

}

}

除了sleep的功能外,TimeUnit还提供了便捷方法用于把时间转换成不同单位,例如,如果你想把秒转换成毫秒,你可以使用下面代码:

TimeUnit.SECONDS.toMillis(44)

它将返回44,000

TimeUnit vs Thread.sleep()

目前我们讨论使用TimeUnit的好处是提高了可读性,但是有时候觉得其他方法更好,因为Thread.sleep()伴随java很早就出现了,几乎所有程序员都知道Thread.sleep(),都知道是将当前线程暂停,而对TimeUnit并不太熟悉。两个原因:一是对比起Thread.sleep(),TimeUnit不是很常用,第二是在它不在Thread类中,就像wait和notify同样不是在Thread中,反正这些需要一段时间才能被采用,并成为一个标准的方式。

总结来说在你想用Thread.sleep()方法的地方你最好使用TimeUnit.sleep()方法来代替。它不尽可以提高代码的可读性而且能更加熟悉java.util.concurrent包,因为TimeUnit在并发编程中也是一个关键API。

-----------------------------------------------------------------------------------

//关于秒的常用方法

TimeUnit.SECONDS.toMillis(1) 1秒转换为毫秒数

TimeUnit.SECONDS.toMinutes(60) 60秒转换为分钟数

TimeUnit.SECONDS.sleep(5) 线程休眠5秒

TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES) 1分钟转换为秒数//TimeUnit.DAYS 日的工具类//TimeUnit.HOURS 时的工具类//TimeUnit.MINUTES 分的工具类//TimeUnit.SECONDS 秒的工具类//TimeUnit.MILLISECONDS 毫秒的工具类

---------------------------------------------------------------------------

1 importjava.util.concurrent.TimeUnit;2

3 public classTimeUnitDemo {4 private TimeUnit timeUnit =TimeUnit.DAYS;5

6 public static voidmain(String[] args) {7 TimeUnitDemo demo = newTimeUnitDemo();8 demo.outInfo();9 demo.timeUnit =TimeUnit.HOURS;10 demo.outInfo();11 demo.timeUnit =TimeUnit.MINUTES;12 demo.outInfo();13 demo.timeUnit =TimeUnit.SECONDS;14 demo.outInfo();15 }16

17 public voidoutInfo() {18 System.out.println(timeUnit.name());19 System.out.println(timeUnit.toDays(1));20 System.out.println(timeUnit.toHours(1));21 System.out.println(timeUnit.toMinutes(1));22 System.out.println(timeUnit.toMicros(1));23 System.out.println(timeUnit.toMillis(1));24 System.out.println(timeUnit.toNanos(1));25 System.out.println(timeUnit.toSeconds(1));26 System.out.println("1天有"+(timeUnit.convert(1, TimeUnit.DAYS))+timeUnit.name());27 System.out.println("12小时"+(timeUnit.convert(12, TimeUnit.HOURS))+timeUnit.name());28 System.out.println("3600秒有"+(timeUnit.convert(36000, TimeUnit.MINUTES))+timeUnit.name());29 System.out.println("-------------------");30 }31 }

java timeunit_java并发之TimeUnit理解相关推荐

  1. java timeunit_java并发之TimeUnit

    一.TimeUnit和Thread.sleep() TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread. ...

  2. java多线程并发之旅-34-性能与可伸缩性

    概述 编写正确的程序很难,而编写正确的并发程序则难上加难.与串行程序相比,在并发程序中存在更多容易出错的地方. 那么,为什么还要编写并发程序? 线程是Java语言中不可或缺的重要功能,它们能使复杂的异 ...

  3. java多线程并发之旅-09-java 生产者消费者 Producer/Consumer 模式

    生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...

  4. java多线程并发之旅-20-同步工具类。闭锁/栅栏/信号量/阻塞队列/FutureTask

    同步工具类 同步工具类主要包括闭锁(如CountDownLatch),栅栏(如CyclicBarrier),信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue)等: F ...

  5. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  6. 关于java多态中覆盖的理解

    在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...

  7. Java异常处理深入理解_关于java异常处理机制的深入理解.doc

    关于java异常处理机制的深入理解.doc 关于JAVA异常处理机制的深入理解1引子TRYCATCHFINALLY恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过 ...

  8. [转载] Java内存管理-你真的理解Java中的数据类型吗(十)

    参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...

  9. JAVA 枚举类的初步理解

    JAVA 枚举类的初步理解 现在Java的枚举类在真实项目中已经用的比较频繁,比静态常量更好用,也更有限定性,enum类可以用来表示有限的类对象,比如星期.月份.性别或者项目中的产品类型 像诸如此类的 ...

最新文章

  1. 科大星云诗社动态20201130
  2. 鸿蒙密视视频加密软件,鸿蒙密视视频加密软件
  3. 【Qt】Qt程序发布
  4. C++11 作用域内枚举
  5. USB-WiFi在x210板子上的移植
  6. python3 批量定义多个变量_Python3 基本数据类型详解
  7. 378. 有序矩阵中第K小的元素
  8. 厉害,刚刚官方宣布 IntelliJ IDEA 2020.2 EAP4发布了!
  9. mybatisplus自动填充时间出现的问题
  10. NYOJ31 5个数求最值
  11. 云计算8项核心技术分析
  12. 合肥工业大学机器人足球仿真robcup作业一(python实现)附代码有注释
  13. Python学习心得
  14. VPS好用吗?VPS和物理机怎么选择?
  15. 百度网盘秒传链接怎么用及实现原理
  16. QT课程设计:基于QT的图像处理程序
  17. linux socket结构,Linux C socket编程中几个常见的结构体定义
  18. 分享一些我的远程办公经验
  19. 淘宝号搜索标签查询,买家标签查询、人群标签查询、淘宝号搜索打标接口、买家标签查询接口、人群标签查询接口
  20. Android如何降低service被杀死概率

热门文章

  1. 推广提升页面转化率的9个技巧,get效果翻倍!
  2. Oracle如何预估将要创建的索引和表的大小
  3. NoSQL Manager for Cassandra 与 NoSQL Manager for MongoDB 破解
  4. vue + element 导航点击不失色
  5. ECCV 2022 | 清华字节提出MGD:适用于分类/检测/分割的生成式知识蒸馏
  6. php自动排版的快捷键,PHPCMS V9教程:ckeditor编辑器添加一键排版功能
  7. 银行卡验证类的API接口,你知道多少?
  8. 如何合理利用通勤时间
  9. ssm+bootsrap人力资源考勤OA人事系统-JAVA【计算机毕业设计、源码、开题报告】
  10. mysqldump中断的常见错误和解决措施【转载】