java-執行緒的生命週期
執行緒的生命週期
-
新建狀態
通過new建立執行緒物件,只是在堆中開闢了一塊空間,執行緒並沒有開始執行
-
可執行狀態
用執行緒物件呼叫start()方法
-
就緒狀態
等待cpu排程,執行緒並沒有開始執行
-
執行狀態
獲得CPU的排程,開始執行,如果有多個CPU,允許多個執行緒並行執行
-
-
等待狀態
同步鎖呼叫wait方法,把當前物件放到等待池中,等待喚醒notify
-
計時等待
sleep方法,進行休眠,休眠過程中並不釋放同步鎖。帶引數的wait方法,如果沒有被其他執行緒喚醒,就等待指定時間自動甦醒
-
阻塞狀態
正在執行的執行緒因為某些原因放棄CPU,暫時停止執行,就會進入阻塞狀態. 此時JVM不會給執行緒分配CPU,直到執行緒重新進入就緒狀態,才有機會轉到執行狀態. 阻塞狀態只能先進入就緒狀態,不能直接進入執行狀態,阻塞狀態的兩種情況:
-
當A執行緒處於執行過程時,試圖獲取同步鎖時,卻被B執行緒獲取.此時JVM把當前A執行緒存到物件的鎖池中,A執行緒進入阻塞狀態.
當執行緒處於執行過程時,發出了IO請求時,此時進入阻塞狀態.
-
-
終止狀態
通常稱為死亡狀態,表示執行緒終止
- 正常執行完run方法而退出(正常死亡)
- 遇到異常而退出(出現異常之後,程式就會中斷)(意外死亡).
聯合執行緒
執行緒的join方法表示一個執行緒等待另一個執行緒完成後才執行。join方法被呼叫之後,執行緒物件處於阻塞狀態。
class Join extends Thread{ public void run(){ for(int i = 0; i < 50; i++){ System.out.println("Join"+"--" + i); } } } public class JoinDemo { public static void main(String[] args) throws Exception { Join j = new Join(); for(int i = 0;i < 50;i++){ System.out.println("main" + "--" + i); if(i == 10){ j.start(); } if(i == 20){ j.join();//強制執行,執行完該執行緒再執行主執行緒 } } } }
後臺執行緒
在後臺執行的執行緒,其目的是為其他執行緒提供服務,也稱為“守護執行緒"。JVM的垃圾回收執行緒就是典型的後臺執行緒。若所有的前臺執行緒都死亡,後臺執行緒自動死亡,前臺執行緒沒有結束,後臺執行緒是不會結束的。測試執行緒物件是否為後臺執行緒:使用thread.isDaemon()。前臺執行緒建立的執行緒預設是前臺執行緒,可以通過setDaenon(true)方法設定為後臺執行緒,並且當且僅當後臺執行緒建立的新執行緒時,新執行緒是後臺執行緒。
public class DeamonDemo { public static void main(String[] args) { //判斷main執行緒是否後臺執行緒 //boolean b = Thread.currentThread().isDaemon(); //System.out.println(b); //設定main執行緒為後臺執行緒,報錯,執行緒一旦建立就不能修改為後臺執行緒 //Thread.currentThread().setDaemon(true); //建立並啟動Demo執行緒,設定為後臺執行緒 /** * 此時Demo為守護執行緒,當所有的前臺執行緒都執行完畢後,守護執行緒自動死亡 * 在這會發現,當主執行緒執行完畢後,守護執行緒Demo沒有執行完自己的方法都結束了 * 但讓也不一定守護執行緒立馬就停止了,也要有反應時間 */ Demo d = new Demo(); d.setDaemon(true); d.start(); for (int i = 0; i < 20; i++) { System.out.println("main" + "--" + i); } } } class Demo extends Thread{ @Override public void run() { for(int i = 0;i < 50;i++){ System.out.println("Demo" + "--" + i); } } }
執行緒的優先順序
每個執行緒都有優先順序,優先順序的高低只和執行緒獲得執行機會的次數多少有關,並非執行緒優先順序越高的就一定先執行,哪個執行緒的先執行取決於CPU的排程。
/** *執行緒的優先順序 *int getPriority() :返回執行緒的優先順序。 *void setPriority(int newPriority) : 更改執行緒的優先順序。 */ public class priority { @SuppressWarnings("static-access") public static void main(String[] args) { //優先順序的預設值為5 System.out.println(Thread.currentThread().getPriority());//5 //更改優先順序(優先順序可以線上程建立之後更改) Thread.currentThread().setPriority(7); System.out.println(Thread.currentThread().getPriority());//7 //建立A執行緒,檢視A執行緒的優先順序, A a = new A(); a.start(); System.out.println(a.getPriority());//7 //Thread類中也有三個常量 System.out.println(a.MAX_PRIORITY);//10 System.out.println(a.MIN_PRIORITY);//5 System.out.println(a.NORM_PRIORITY);//1 } } class A extends Thread{ @Override public void run() { }