目錄
- 六大狀態
- 舉例說明
六大狀態
- New 新建狀態:線程還沒出創建,只有Thread 實例化的對象,調用start 方法之前的狀態。
- Runnable 運行狀態:被系統調度后,CPU 正在執行的,Ready 就緒態,系統調度,隨時準備被CPU 執行。
- Blocked 阻塞狀態:線程遇到某種機制之后不參與 CPU的調度執行,等待某個條件的觸發喚醒線程
- waiting 等待狀態: 無限期等待(死等)
- Time_Waiting 超時等待狀態:設置了最大等待時間,超出最大等待時間就換醒線程
- Terminated 終止狀態:線程生命周期結束后的狀態
舉例說明
- 接下來我說一個例子來說一下這幾個關于線程的狀態
阿杰和千均(兩個線程)都喜歡上了小美, 兩個人心里面都打算怎么追到小美(new 新建狀態), 之后他們時刻關注著小美的動態,等著合適的機會接近(線程 READY 就緒狀態, 準備如何追到小美)。
小美周末一個人去圖書館,阿杰覺得機會來了,主動上前打招呼并提出一起學習(線程的運行狀態, 達成與小美做事, 處于追到小美的運行)。聊天過程中,阿杰想約小美晚上看電影,可小美說要先回宿舍問室友有沒有空,一起的話更熱鬧,阿杰只好等著小美回復(導致當前追求步驟暫停(線程堵塞)的原因是:等待小美詢問室友的結果, 小美沒說具體時間是多久)。
因為阿杰暫時等不到小美答復,沒法繼續推進約會的事,所以陷入阻塞等待(等小美回消息)。這時候千均看到小美在圖書館外打電話,趕緊走過去遞上一杯熱奶茶(此時相當于 CPU 調度切換,千均從就緒狀態進入運行狀態)。千均和小美聊得不錯,想約她下周去看畫展,小美說下周要準備考試,得考完試才行,大概一周后有空,此時千均線程陷入了等待狀態,具有時效性,線程需要等一周就可以繼續執行了),一周后千均就可以再約小美去看畫展。
這邊千均等待的時候,小美給阿杰回了消息,說室友有空,晚上可以一起去看電影,阿杰收到消息后(忽略初始的心理準備),重新調整狀態,準備晚上的約會安排(阿杰獲得繼續追求的條件,從阻塞狀態中喚醒,來到就緒狀態準備進一步行動)。到了晚上,阿杰和小美以及她的室友一起看完電影,可小美說 “我和室友一起走就行,你先回去吧,明天再說”,此時阿杰知道要等明天才有機會,于是進入等待狀態(有明確的等待節點,知道第二天可以再嘗試)。?
第二天,阿杰聯系小美時,發現小美正在忙社團活動,沒回消息,阿杰只能等著她忙完(此時又進入阻塞狀態,因為不知道小美具體什么時候忙完,只能被動等待回復)。過了幾個小時,小美回復說活動結束了,阿杰趕緊抓住機會約她吃飯,小美同意了。吃飯時阿杰好好表現,之后兩人關系逐漸升溫,阿杰成功追到了小美,這個追求線程也就結束了(線程結束狀態)。
但是千均成了小丑, 還處于等待狀態, 等待一個星期之后呢, 但是一個星期之后阿杰牽著小美的手出現在千均面前, 千均看到小美過來等待成功, 這個時候看到阿杰和小美的動作已經知道沒機會了, 千均就進入了(線程結束狀態)
package thread;
import static java.lang.Thread.sleep;
public class ThreadDemo18 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for(int i = 0; i < 5; i++) {System.out.println("線程執行中...");try {sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}}});//線程啟動之前, 狀態就是 NEWSystem.out.println(t.getState());t.start();System.out.println(t.getState());sleep(500);System.out.println(t.getState());t.join();//線程運行完畢, 狀態就是 TERMINATEDSystem.out.println(t.getState());}
}