java.lang.Thread run() 方法可以使當線程進入休眠狀態,時間取決于你聲明的毫秒時長。此參數不可以為負數,若傳入負數,程序會拋出IllegalArgumentException異常。
還有另外一個方法可以使線程休眠達到毫微秒級別 -- sleep(long mills, int nanos)。毫微秒參數的范圍在0 ~ 999999之間。
下面有段例子代碼展示的是在執行Thread.sleep() 代碼處會讓main線程進行休眠狀態并持續2秒鐘。
ThreadSleep.java
package com.journaldev.threads;
public class ThreadSleep {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000);
System.out.println("Sleep time in ms = "+(System.currentTimeMillis()-start));
}
}
如果你嘗試運行了上面的代碼,你會發現打印出來的時間結果略微比2秒長點,造成此結果是因為線程休眠工作方式及操作系統具體執行程序的調度方式。
線程休眠的關鍵點
- 總會停止當前線程的運行。
- 線程從進入休眠狀態到被喚醒中所花的時間取決于操作系統的統一調度。當操作系統處理任務較少的時候,這個時間會相對準確一些,而當操作系統任務多繁忙時,這個時間會花的相對多些。
- 線程在休眠狀態時并不會丟失其獲得監視器及線程鎖。
- 任何其他線程如果打斷進入休眠狀態的線程,都會拋出一個InterruptedException異常。
線程休眠是如何工作的
Thread.sleep() 實際上是使線程從運行時狀態轉換為休眠狀態,并且等待被喚醒,而喚醒時長取決你傳入的時間值。一旦當等待時間結束,線程會從休眠狀態轉換為運行時狀態,并且等待CPU在未來的某個時間點分配資源片區來執行。所以實際等待時間是由操作系統來決定的。