- 首先给出结论:
- 线程使用中的暂停,建议优先使用TimeUnit类中的sleep()
- 但需要注意传入时间小于0的异常情况
- TimeUnit是java.util.concurrent包下的一个类名
- 主要功能是暂停线程的操作
- 拥有与Thread.sleep()一样的功能都是暂停线程,但TimeUnit提供了可读性更好的线程暂停操作
- 可以指定DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS和NANOSECONDS
- 而Thread.sleep()参数如下:
- 它可以接收长整型毫秒和长整型的纳秒参数,这样对程序员造成的一个问题就是
- 很难知道到底当前线程是睡眠了多少秒、分、小时或者天
- 看看下面这个Thread.sleep()方法:
- 粗略一看,你能计算出当前线程是等待多长时间吗?
- 可能有些人可以,但是对于大多数程序员来说这种写法的可读性还是很差的
- 你需要把毫秒转换成秒和分,让我们来看看另外一个例子
- 这个例子比前面那个例子可读性稍微好一点:
- 这比前面那个例子已经好多了,但是仍然不是最好的
- 你注意到睡眠时间用毫秒,不容易猜出当前线程将等待4分钟
- TimeUnit类解决了这个问题,通过指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS
- TimeUnit是Java枚举应用场景中最好的例子之一
- 所有TimeUnit都是枚举实例
- 让我们来看看线程睡眠4分钟用TimeUnit是如何使用的
- 你可以看到这比Thread的sleep方法的可读性好多了
- 记住TimeUnit.sleep()内部调用的Thread.sleep()也会抛出InterruptException
- 除了sleep的功能外,TimeUnit还提供了便捷方法用于把时间转换成不同单位
- 例如,如果你想把秒转换成毫秒,你可以使用下面的代码:
- 它将返回44,000
- 枚举常量摘要:
- 但需要注意的是:
- TimeUnit调用的sleep方法,如果传入的时间是小于0的那么不会做任何的事情
- 而sleep方法,如果传递的参数小于0,是会抛出异常的