1. 程式人生 > >java TimeUnit vs Thread.sleep的用法對比

java TimeUnit vs Thread.sleep的用法對比

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皮秒