Java執行緒休眠(sleep)示例
阿新 • • 發佈:2019-02-14
java.lang.Thread的sleep()方法能使當前執行緒暫停執行一段時間(單位毫秒)。需要注意的是,sleep()方法的引數不能為負,否則會丟擲IllegalArgumentException異常。
除此之外,還有另一個方法sleep(long millis, int nanos),該方法可用於使當前執行緒暫停millis毫秒nanos納秒。需要注意的是,引數nanos的取值範圍為[0, 999999]。
下面的程式碼演示如何用Thread.sleep()方法令主執行緒暫停執行2秒。
ThreadSleep.java
如果你執行上述程式,你會發現最後打印出來的結果會比2000略多一些,這取決於執行緒休眠是如何實現的,以及作業系統定義的執行緒排程機制。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)); } }
執行緒休眠要點
1. 執行緒休眠總是暫停當前執行緒
2. 在被喚醒並開始執行前,執行緒休眠的實際時間取決於系統計時器和排程器。對比較清閒的系統來說,實際休眠的時間十分接近於指定的休眠時間,但對於繁忙的系統,兩者之間的差距就較大。
3. 執行緒休眠並不會丟失當前執行緒已獲取的任何監視器和鎖。
4. 其他執行緒可以中斷當前程序的休眠,但會丟擲InterruptedException異常。
執行緒休眠的工作原理
Thread.sleep()與執行緒排程器互動,它將當前執行緒設定為等待一段時間的狀態。一旦等待時間結束,執行緒狀態就會被改為可執行(runnable),並開始等待CPU來執行後續的任務。因此,當前執行緒的實際休眠時間取決於執行緒排程器,而執行緒排程器則是由作業系統來進行管理的。