一、基礎概念
Java的線程睡眠是指讓當前線程掛起一段時間,在指定時間後再繼續執行。線程睡眠可以被其它線程打斷,也可以設置是否響應中斷。Java的線程睡眠的主要用途是使當前線程等待一段時間,或者是讓出CPU,減輕CPU的負擔,讓其他線程有機會獲取CPU資源。
Java的線程睡眠是通過Thread類的sleep()方法來實現的。sleep方法有兩個重載方法,它們分別是:
1. public static void sleep(long millis) throws InterruptedException 2. public static void sleep(long millis,int nanos) throws InterruptedException
這兩個方法都可能拋出InterruptedException異常,其中第一個方法的參數是線程睡眠的毫秒數,第二個方法的參數是線程睡眠的毫秒數和納秒數。
二、使用示例
以下示例代碼展示了線程睡眠的基本用法:
class SleepDemo extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("線程睡眠中..." + i); try { Thread.sleep(1000); //線程睡眠1秒鐘 } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { SleepDemo thread = new SleepDemo(); thread.start(); } }
以上代碼創建了一個SleepDemo線程,它會在其run方法中睡眠1秒鐘,然後再執行下一次循環。在Main類的main方法中創建了一個SleepDemo線程,並啟動線程。程序運行時,控制台會輸出以下內容:
線程睡眠中...0 線程睡眠中...1 線程睡眠中...2 線程睡眠中...3 線程睡眠中...4 線程睡眠中...5 線程睡眠中...6 線程睡眠中...7 線程睡眠中...8 線程睡眠中...9
中間每個輸出之間都會睡眠1秒鐘。
三、線程睡眠被中斷
由於Java的線程睡眠可以被其它線程打斷,因此可能出現「線程睡眠被中斷」的情況。以下示例代碼展示了這種情況:
class SleepDemo2 extends Thread { volatile boolean flag = true; public void run() { while (flag) { System.out.println("線程睡眠中..."); try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("線程睡眠被中斷..."); } } } } public class Main { public static void main(String[] args) throws InterruptedException { SleepDemo2 thread = new SleepDemo2(); thread.start(); Thread.sleep(10000); thread.flag = false; thread.interrupt(); } }
以上代碼創建了一個SleepDemo2線程,它會在while循環中睡眠5秒鐘,每個循環輸出一次「線程睡眠中…」字元串。在Main類的main方法中,先創建並啟動線程SleepDemo2,然後讓主線程睡眠10秒鐘後設置SleepDemo2的標誌位為false,同時調用SleepDemo2線程的interrupt方法中斷該線程的睡眠狀態。
程序運行時,控制台會輸出以下內容:
線程睡眠中... 線程睡眠中... 線程睡眠中... 線程睡眠中... 線程睡眠被中斷...
在SleepDemo2線程第二次循環開始之前,它的睡眠狀態被主線程中斷了,然後進入catch組中的代碼,輸出「線程睡眠被中斷…」字元串。
四、線程睡眠不響應中斷
在設置線程睡眠時,可以設置線程不響應中斷。示例代碼如下:
class SleepDemo3 extends Thread { volatile boolean flag = true; public void run() { while (flag) { System.out.println("線程睡眠中..."); try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("線程睡眠被中斷..."); } } } } public class Main { public static void main(String[] args) throws InterruptedException { SleepDemo3 thread = new SleepDemo3(); thread.start(); Thread.sleep(10000); thread.flag = false; thread.interrupt(); } }
以上代碼與前面的SleepDemo2代碼相同,但是在SleepDemo3的run方法中,並沒有對線程的中斷狀態進行判斷,因此即使使用了thread.interrupt方法,該線程也會繼續睡眠,並不會被中斷。
程序運行時,控制台會輸出以下內容:
線程睡眠中... 線程睡眠中... 線程睡眠中... 線程睡眠中... 線程睡眠中... 線程睡眠中... 線程睡眠中...
SleepDemo3線程沒有響應主線程的中斷請求,仍然在繼續睡眠狀態。
五、小結
本文詳細介紹了Java線程睡眠的基礎概念和使用方法,並通過示例代碼演示了線程睡眠被中斷和線程睡眠不響應中斷的情況。在實際的Java程序開發中,線程睡眠通常用於控制流程的順序性和節約CPU資源等方面,但是需要注意線程睡眠被中斷的情況,以便保證程序的穩定性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/227571.html