深入探究Java線程的狀態(tài)與生命周期
一、線程的狀態(tài)
NEW: 安排了工作, 還未開始行動
RUNNABLE: 可工作的. 又可以分成正在工作中和即將開始工作.
BLOCKED: 這幾個都表示排隊等著其他事情
WAITING: 這幾個都表示排隊等著其他事情
TIMED_WAITING: 這幾個都表示排隊等著其他事情
TERMINATED: 工作完成了
新建(初始)
當繼承Thread類和實現了Runnable接口,就可以創(chuàng)建線程,新建一個對象就是初始狀態(tài)
就緒(可運行)
- 調用線程的start()方法,此線程進入可運行狀態(tài)。
- 當前線程sleep()方法結束,其他線程join()結束,等待用戶輸入完畢,某個線程拿到對象鎖,這些線程也將進入可運行狀態(tài)。
- 當前線程時間片用完了,調用當前線程的yield()方法,當前線程進入可運行狀態(tài)。
- 鎖池里的線程拿到對象鎖后,進入可運行狀態(tài)。
運行
可運行狀態(tài)(runnable)的線程獲得了cpu 時間片(timeslice) ,執(zhí)行程序代碼,就到了運行狀態(tài)
阻塞
阻塞狀態(tài)是指線程因為某種原因放棄了cpu 使用權,也即讓出了cpu 時間片,暫時停止運行。直到線程進入可運行(runnable)狀態(tài),才有機會再次獲得cpu 時間片轉到運行(running)狀態(tài)
- 當前線程T調用Thread.sleep()方法,當前線程進入阻塞狀態(tài)。
- 運行在當前線程里的其它線程t2調用join()方法,當前線程進入阻塞狀態(tài)。
- 等待用戶輸入的時候,當前線程進入阻塞狀態(tài)
死亡
- 當線程的run()方法完成時,或者主線程的main()方法完成時,我們就認為它死去。這個線程對象也許是活的,但是,它已經不是一個單獨執(zhí)行的線程。線程一旦死亡,就不能復生。
- 在一個死去的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常
二、線程的狀態(tài)轉移
NEW , RUNNABLE ,TERMINATED 狀態(tài)的轉移
使用 isAlive 方法判定線程的存活狀態(tài)
public class ThreadStateTransfer { public static void main(String[] args) throws InterruptedException { Thread t = new Thread(() -> { for (int i = 0; i < 1000_0000; i++) { } }, "李四"); System.out.println(t.getName() + ": " + t.getState());; t.start(); while (t.isAlive()) { System.out.println(t.getName() + ": " + t.getState());; } System.out.println(t.getName() + ": " + t.getState());; } }
yield() 方法,讓出 CPU執(zhí)行權
/** * yield讓出CPU執(zhí)行權 */ public class ThreadYield { public static void main(String[] args) { Thread thread = new Thread(() ->{ Thread t1 = Thread.currentThread(); for (int i = 0; i < 10; i++) { //讓出CPU執(zhí)行權 Thread.yield(); System.out.println("執(zhí)行了線程" + t1.getName()); } },"張三"); thread.start(); //創(chuàng)建并啟動線程 new Thread(() -> { Thread t1 = Thread.currentThread(); for (int i = 0; i < 10; i++) { System.out.println("執(zhí)行了線程" + t1.getName()); } },"李四").start(); }
結論
yield 不改變線程的狀態(tài), 但是會重新去排隊
三、線程的生命周期
- 新建:創(chuàng)建線程對象
- 就緒:線程有執(zhí)行資格,沒有執(zhí)行權
- 運行:有執(zhí)行資格,有執(zhí)行權
- 阻塞:由于一些操作讓線程改變了狀態(tài),沒有執(zhí)行資格,沒有執(zhí)行權,另一些操作可以把它給激活,激活處于就緒狀態(tài)
- 死亡:線程對象變成垃圾,等待被回收
到此這篇關于深入探究Java線程的狀態(tài)與生命周期的文章就介紹到這了,更多相關Java線程狀態(tài)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于JSONObject.toJSONString出現地址引用問題
這篇文章主要介紹了關于JSONObject.toJSONString出現地址引用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03