现在的位置: 首页 > 综合 > 正文

java TimeUnit vs Thread.sleep的用法对比

2017年08月09日 ⁄ 综合 ⁄ 共 1401字 ⁄ 字号 评论关闭

TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep()。在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它。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);


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

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还提供了便捷方法用于把时间转换成不同单位,例如,如果你想把秒转换成毫秒,你可以使用下面代码:
TimeUnit.SECONDS.toMillis(44)
它将返回44,000
注意:
1毫秒=1000微秒
1微秒=1000纳秒
1纳秒=1000皮秒


转载自:http://www.strutshome.com/index.php/archives/567

抱歉!评论已关闭.