您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java的線程狀態是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java的線程狀態是什么”文章能幫助大家解決問題。
Java的每個線程都具有自己的狀態,Thread類中成員變量threadStatus存儲了線程的狀態:
private volatile int threadStatus = 0;
在Thread類中也定義了狀態的枚舉,共六種,如下:
public enum State { NEW, // 新建狀態 RUNNABLE, // 執行狀態 BLOCKED, // 阻塞狀態 WAITING, // 無限期等待狀態 TIMED_WAITING, // 有限期等待狀態 TERMINATED; // 退出狀態 }
threadStatus初始值為0,對應的就是NEW狀態。
NEW:新建狀態,new Thread()時處于這個狀態,此時線程還未開始執行
RUNNABLE:執行狀態,當調用了start方法后,線程處于此狀態,當然此刻CPU不一定正在執行它
BLOCKED:阻塞狀態,線程等待鎖時處于此狀態
WAITING:無限期等待狀態,需要被喚醒的等待屬于此狀態,如Object.wait
TIMED_WAITING:有限期等待狀態,調用一些有超時時間的等待方法會進入此狀態,如Thread.sleep、Object.wait、Thread.join、Lock.tryLock、Condition.await
TERMINATED:退出狀態,可能是正常運行完畢,也可能是拋出了異常導致線程終止
我們可以通過getState獲取線程的狀態:
State state = thread.getState();
接下來,我們通過示例來感受線程狀態的變化。
示例一:
Thread t = new Thread(() -> { System.out.println("sleep"); // 休眠2秒 ThreadUtil.sleep(2000); System.out.println("run"); }); // 啟動前先打印一下線程狀態 System.out.println(t.getState()); // 啟動線程 t.start(); // 啟動后立即打印一次線程狀態 System.out.println(t.getState()); // 每隔500毫秒打印一次線程狀態 while (true) { ThreadUtil.sleep(500); System.out.println(t.getState()); }
輸出:
NEW
RUNNABLE
sleep
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
run
TERMINATED
TERMINATED
TERMINATED
TERMINATED
TERMINATED
TERMINATED
TERMINATED
可以看出,線程創建后,初始狀態為NEW;
調用start方法后狀態變更為了RUNNABLE;
當線程內執行了sleep,休眠2秒鐘,狀態變更為了TIMED_WAITING;
當線程執行完成后,狀態變更為了TERMINATED。
示例二:
本示例演示在多線程爭搶鎖的情況下,線程狀態的變化。
private static Object lock = new Object(); public static void main(String[] args) { Runnable runnable = () -> { // 加鎖 synchronized (lock) { System.out.println(Thread.currentThread().getName() + " lock"); ThreadUtil.sleep(2000); } System.out.println(Thread.currentThread().getName() + " exit"); }; Thread t1 = new Thread(runnable, "t1"); Thread t2 = new Thread(runnable, "t2"); t1.start(); t2.start(); while (true) { ThreadUtil.sleep(500); System.out.println(t1.getName() + ":" + t1.getState()); System.out.println(t2.getName() + ":" + t2.getState()); } }
輸出:
t1 lock t1獲得了鎖
t1:TIMED_WAITING t1 sleep,進入有限等待狀態
t2:BLOCKED t2未獲得鎖,因此進入阻塞狀態
t1:TIMED_WAITING
t2:BLOCKED
t1:TIMED_WAITING
t2:BLOCKED
t1 exit t1釋放鎖,執行完成,退出
t2 lock t2獲得鎖
t1:TERMINATED t1已經是退出狀態
t2:TIMED_WAITING t2 sleep,進入有限等待狀態
t1:TERMINATED
t2:TIMED_WAITING
t1:TERMINATED
t2:TIMED_WAITING
t1:TERMINATED
t2:TIMED_WAITING
t2 exit t2釋放鎖,執行完成,退出
t1:TERMINATED t1為退出狀態
t2:TERMINATED t2為退出狀態
示例三:
本示例演示了線程如何進入和退出WAITING狀態。
private static Object obj = new Object(); public static void main(String[] args) { Runnable runnable = () -> { synchronized (obj) { try { // 等待 obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("exit"); } }; Thread t1 = new Thread(runnable, "t1"); System.out.println(t1.getName() + ":" + t1.getState()); t1.start(); System.out.println(t1.getName() + ":" + t1.getState()); for (int i = 0; i < 20; i++) { ThreadUtil.sleep(500); if(i == 3) { synchronized (obj) { // 喚醒 obj.notify(); } } System.out.println(t1.getName() + ":" + t1.getState()); } }
輸出:
t1:NEW
t1:RUNNABLE
t1:WAITING 調用了obj.wait()進入無限等待狀態
t1:WAITING
t1:WAITING
t1:BLOCKED 主線程獲得鎖,進行notify,t1進入了阻塞狀態
exit t1線程退出同步塊,執行完成
t1:TERMINATED t1線程退出
t1:TERMINATED
Java Thread的threadStatus字段值的更新代碼位于hotspot c++源碼中,JDK源碼中看不到。
Java的線程狀態并非是操作系統的實際線程狀態,但與操作系統的線程狀態是有對應關系的,后續有需要深入分析操作系統原理、hotspot源碼再展開。
關于“Java的線程狀態是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。