在Java程序中,會出現線程執行速度過快或者程序需要切換到另一個線程的情況。為此,您需要暫停當前線程的執行。在 Java 中,這可以使用java.lang.Thread.sleep()方法來完成。
Thread.sleep() 方法
Thread類存在於 Java.lang 包中並包含Thread.sleep()方法。 java.lang.thread sleep()方法用於將當前線程暫停指定的時間量(以毫秒為單位)。如果您查看Oracle 文檔,您會發現Thread類有兩個重載的sleep()方法。
static void sleep(long millis)
其中 millis 是以毫秒為單位的時間。此方法導致當前正在執行的線程休眠(暫時停止執行,“休眠”)毫秒數,具體取決於系統計時器和調度程序的精度。毫秒的參數值不能為負數。如果是這樣,將拋出 IllegalArgumentException 。
static void sleep(long millis, int nanos)
其中 mills 時間以毫秒為單位,nanos 是以納秒為單位的時間。此方法的變體用於以毫秒和納秒為單位的確切時間暫停當前線程的執行。納秒值在 0 到 999999 之間有效。讓我們創建一個簡單的程序,使用Thread.sleep()方法暫停主線程的執行 5 秒:
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
}
}
這個程序發生了什麼?首先它啟動,然後休眠 5 毫秒(5 秒),然後向控制台打印一條關於它被凍結了多長時間的消息,然後退出。輸出是:
線程暫停 5008 毫秒
正如你所看到的,程序並沒有暫停 5 秒,而是暫停了一點。此外,如果您在計算機上運行該程序,您會注意到它可能會停止線程的執行超過 5000 毫秒,而 5008 毫秒是不必要的。關鍵是這一切都取決於操作系統和線程調度程序的具體實現。更詳細一點,線程在喚醒和開始執行之前等待的實際時間取決於系統計時器和調度程序。對於安靜的系統,實際休眠時間接近於指定的休眠時間,但對於負載系統,它會稍微長一些。當你需要一直做一些動作,但不是太頻繁時,這個方法經常用在子線程中。這是一個每秒打印一條消息並且永不退出的程序示例:
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
while (true)
{
Thread.sleep(1000);
System.out.println("One more second");
}
}
}
Java Thread Sleep的要點
請務必記住,Java Thread Sleep方法的工作方式如下:-
它總是暫停當前線程的執行。
-
實際線程會一直休眠直到被喚醒,執行時間取決於系統定時器和調度器。
-
休眠線程不會阻塞當前線程。
-
任何其他線程都可以中斷當前休眠線程,在這種情況下會拋出InterruptedException 。
-
毫秒的參數值不能為負數,否則將拋出IllegalArgumentException 。
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(-5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
}
}
這是輸出:
線程“main”中的異常 java.lang.IllegalArgumentException:SleepDemo.main(SleepDemo.java:7) 的 java.base/java.lang.Thread.sleep(Native Method) 的超時值為負
上面我們讓主線程進入睡眠狀態。現在讓我們嘗試將該方法應用於其他線程。
// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{
public void run()
{
// thread 0
try {
for (int i = 0; i < 10; i++) {
// sleeps the main thread for about 2 seconds
Thread.sleep(2000);
System.out.println(i);
}
}
catch (Exception e) {
// catching the exception
System.out.println(e);
}
}
public static void main(String[] args)
{
SleepDemo2 sleepDemo2 = new SleepDemo2();
sleepDemo2.start();
}
}
輸出是:
0 1 2 3 4 5 6 7 8 9
GO TO FULL VERSION