這篇文章帶給大家的內容是關於Java線程的生命週期的介紹(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
一、執行緒的生命週期
進程與執行緒一樣,都具有一定的生命週期,執行緒的生命週期包含四個狀態:建立狀態、就緒狀態、阻塞狀態、死亡狀態。
1.創建狀態
1)是指使用new實例化一個線程對象,但該線程對象還未使用start()方法啟動線程這個階段,該階段只在內存的堆中為此物件的實例變數分配了記憶體空間,但執行緒還無法參與搶奪CPU的使用權;
#2)創建完畢線程物件後,啟動該線程物件的是start()方法,而不是run()方法。
2.就緒狀態
1)是指一個執行緒物件使用start()方法後到執行完run()方法的這個階段,執行緒一旦就進入就緒階段,Java虛擬機為此執行緒建立方法的呼叫堆疊和計數器等;
2)在某一單位時間(時間片)內,CPU只能執行一個執行緒,一但一個執行緒擁有了CPU的使用權,則該執行緒也可稱為正在運行狀態;
3)凡是處於就緒狀態的執行緒都被視為活動的,可以使用isAlive()方法測試執行緒是否處於就緒狀態,使用activeCount()來查詢目前執行緒所在執行緒池的活動執行緒數;
4)處於就緒狀態的執行緒並不是運行狀態,在以前的電腦很多都是單處理器的,要在同一時刻運行所有處於就緒狀態的執行緒是不可能的,Java透過一些調度演算法來保證這些執行緒共享使用處理器(如時間片輪轉演算法、獨佔演算法等)。
3.阻塞狀態:
1)阻塞狀態包含四個狀態(睡眠狀態、阻塞狀態、掛起狀態、等待狀態),一般來說,阻塞狀態和就緒狀態可以互相切換的;
2)使用sleep()方法可以執行緒進入睡眠狀態,讓其他行程得到執行機會,但是用sleep方法必須捕捉InterruptedExecption異常;
#3)使用suspend方法可以掛起執行緒(jdk1.2後已過時)、使用wait方法使執行緒進入等待狀態(後面有一個隨筆會專門寫)、使用I/O中斷讓執行緒進入阻塞狀態。
4.死亡狀態:
1)一旦執行緒執行完run方法,執行緒即進入死亡狀態,Java虛擬機會銷毀處於死亡狀態的執行緒物件所佔用的系統資源;
2)執行緒執行時遇到一個未捕獲的異常,執行緒會被終止並進入死亡狀態;呼叫stop方法也可以讓執行緒進入死亡狀態,但是容易造成死鎖,已棄用。
5.執行緒生命週期如下圖:
#二、以下是sleep方法讓執行緒進入睡眠狀態的案例
/** * @author: PrincessHug * @date: 2019/4/12, 9:20 * @Blog: https://www.cnblogs.com/HelloBigTable/ */ public class SleepDemo implements Runnable{ @Override public void run() { long l; for (int i=1;i<6;i++){ l = System.currentTimeMillis(); try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } l = (System.currentTimeMillis() - l); System.out.println(Thread.currentThread().getName() + "线程执行了" + i + "次,耗时" + l + "毫秒。"); } } } public class SleepDriver { public static void main(String[] args) { SleepDemo sd = new SleepDemo(); for (int i=0;i<50;i++){ new Thread(sd,i + "#").start(); } } }
下面是部分運行結果截圖:
可以看到如果同時啟動的執行緒越多,會導致每個執行緒的耗時越長。
以上是Java線程的生命週期的介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!