TimeUnit是什么?java
TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操做,一般用来替换 Thread.sleep(),在很长一段时间里Thread的sleep()方法做为暂停线程的标准方式,几乎全部Java程序员都熟悉它,事实上 sleep方法自己也很经常使用并且出如今不少面试中。若是你已经使用过Thread.sleep(),固然我确信你这样作过,那么你必定熟知它是一个静态方 法,暂停线程时它不会释放锁,该方法会抛出InterrupttedException异常(若是有线程中断了当前线程)。可是咱们不少人并无注意的一 个潜在的问题就是它的可读性。Thread.sleep()是一个重载方法,能够接收长整型毫秒和长整型的纳秒参数,这样对程序员形成的一个问题就是很难 知道到底当前线程是睡眠了多少秒、分、小时或者天。看看下面这个Thread.sleep()方法:程序员
1
|
Thread.sleep(
2400000
)
|
粗略一看,你能计算出当前线程是等待多长时间吗?可能有些人能够,可是对于大多数程序员来讲这种写法的可读性仍是不好的,你须要把毫秒转换成秒和分,让咱们来看看另一个例子,这个例子比前面那个例子可读性稍微好一点:面试
1
|
Thread.sleep(
4
*
60
*
1000
);
|
这比前面那个例子已经好多了,可是仍然不是最好的,你注意到睡眠时间用毫秒,不容易猜出当前线程将等待4分钟。TimeUnit类解决了这个问题, 经过指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS。 java.utils.concurrent .TimeUnit 是Java枚举应用场景中最好的例子之一,全部TimeUnit都是枚举实例,让咱们来看看线程睡眠4分钟用TimeUnit是如何使用的。编程
1
|
TimeUnit.MINUTES.sleep(
4
);
// sleeping for 1 minutes
|
相似你能够采用秒、分、小时级别来暂停当前线程。你能够看到这比Thread的sleep方法的可读的好多了。记住 TimeUnit.sleep()内部调用的Thread.sleep()也会抛出InterruptException。你也能够查看JDK源代码去验 证一下。下面是一个简单例子,它展现若是使用TimeUnit.sleep()方法。并发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
*
* Java program to demonstrate how to use TimeUnit.sleep() method in Java.
* TimeUnit is a new way of introducing pause in Java program.
* @author Javin
*/
public
class
TimeUnitTest {
public
static
void
main(String args[])
throws
InterruptedException {
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还提供了便捷方法用于把时间转换成不一样单位,例如,若是你想把秒转换成毫秒,你可使用下面代码:spa
1
|
TimeUnit.SECONDS.toMillis(44)
|
它将返回44,000.net
TimeUnit vs Thread.sleep()线程
目前咱们讨论使用TimeUnit的好处是提升了可读性,可是有时候以为其 他方法更好,由于Thread.sleep()伴随java很早就出现了,几乎全部程序员都知道Thread.sleep(),都知道是将当前线程暂停, 而对TimeUnit并不太熟悉。两个缘由:一是对比起Thread.sleep(),TimeUnit不是很经常使用,第二是在它不在Thread类中,就 像wait和notify一样不是在Thread中,反正这些须要一段时间才能被采用,并成为一个标准的方式。code
总结来讲在你想用Thread.sleep()方法的地方你最好使用TimeUnit.sleep()方法来代替。它不尽能够提升代码的可读性并且能更加熟悉java.util.concurrent包,由于TimeUnit在并发编程中也是一个关键API。ci