Thread.sleep() 和 TimeUnit.SECONDS.sleep() 该如何选择?

667 阅读2分钟

前言

  本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  前两天在研究线程的时候发现了一个比较好用的类 TimeUnit 类,今天来记录一下和 Thread.sleep() 的区别,同时也是为了我们另一篇文章做了一些铺垫

正文

  Thread.sleep() 和 TimeUnit.SECONDS.sleep() 的不同点     前者这个就不用多说了吧,是 Thread 类的一个静态方法,作用:使当前线程休眠,进入阻塞状态(暂停执行),简单理解就是“线程暂停方法”,而 TimeUnit.SECONDS.sleep() 是 concurrent 包下的一个类,提供了可读性更好的线程暂停操作   优劣比较:后者相较于前者来讲,可读性提升了,还增加了一个时间转换的方法

为什么要说后者比前者的可读性高呢?

  因为 Thread.sleep() 是一个重载方法,可以接收长整形毫秒和整型纳秒(讲真的有时候,换算时间就要半天,尤其是新手写的时候,不太友好) 在这里插入图片描述   举个例子来讲:方法一的代码,第一眼看上去你能知道这是多少分钟么?或者使用方法二的代码(某种意义上来讲可读性增加了一点点)

// 方法一
Thread.sleep(2400000);  
// 方法二 
Thread.sleep(4 * 60 * 1000); 

  而 TimeUnit.SECONDS.sleep() 就不一样了!他提供了很多的枚举类(具体类请查看下方表格,这个地方我们就不看源码截图了,太长!),还提供了时间转化方法

// 睡眠一天
TimeUnit.DAYS.sleep(1);
// 睡眠一小时
TimeUnit.HOURS.sleep(1);
// 睡眠一分钟
TimeUnit.MINUTES.sleep(1);
// 睡眠一秒钟
TimeUnit.SECONDS.sleep(1);

  例如:秒转换成毫秒,可以这样写

TimeUnit.SECONDS.toMillis(44)

  其他类型转换 在这里插入图片描述 枚举类参数表:

名称单位
DAYS
HOURS小时
MINUTES分钟
SECONDS
MILLISECONDS毫秒(千分之一秒)
MICROSECONDS微秒(一百万分之一秒(就是毫秒/1000))
NANOSECONDS毫微秒(十亿分之一秒(就是微秒/1000))
  补充:不管是 Thread.sleep() 还是 TimeUnit 一定要抛出异常块(InterruptedException)如果参数值为负数或者等待中被打断都会进入此异常块
在这里插入图片描述

总结

  Thread.sleep() 唯一一个让我退缩的点可能就是时间转换了,毕竟有了更简便的 TimeUnit 衬托,所以我比较倾向于 TimeUnit 类,可能写的有点表面了,后面有时间再深度研究一下,先记录一下