執行緒的生命週期狀態

2021-09-26 07:47:47 字數 1477 閱讀 6533

第一步:

新建狀態:使用new關鍵字新建執行緒,此時處於新建狀態;

第二步:

就緒狀態:當呼叫了該執行緒的start()方法,執行緒啟動,處於就緒狀態,但是不一定執行;

第三步:

執行狀態:需要考作業系統cup的排程執行,如果作業系統是搶占式排程,當執行緒搶占到了cup的執行許可權,執行緒開始執行;如果是分時排程系統,等待作業系統分配時間片給執行緒,執行緒執行;在乙個時間片執行完畢之後,執行緒將cup資源釋放,回到就緒狀態,等待下一次獲得cup的執行許可權;

第四步:

死亡狀態:如果執行緒中的run()方法執行完畢,此時執行緒結束,即變為死亡狀態,不可以再次呼叫start()方法重新啟動執行緒,只能在一次new新建;

那麼比較複雜的是執行狀態和就緒狀態之間呢,會發生執行緒的阻塞狀態,是介於執行狀態和就緒狀態之間的;

注:當程序此刻cup時間片用完,執行緒從執行狀態直接到就緒狀態,不是進入阻塞狀態;

來看一下,有哪些情況,程式會從執行狀態到阻塞狀態呢!

執行狀態--->阻塞狀態:

執行緒中呼叫了sleep()方法;

執行緒執行過程中有另外乙個執行緒加入進來,優先執行加入進來的程序;

程式中需要使用者的輸入,執行緒會阻塞等待使用者的輸入才能繼續執行;

上面是進入到阻塞狀態,那麼阻塞狀態如何恢復到就緒狀態呢?這裡需要注意阻塞狀態不會直接轉入執行狀態,只能轉換到就緒狀態,等待cup排程 

阻塞狀態--->就緒狀態:

sleep()時間結束;

加入進來的執行緒執行完畢;

使用者控制台輸入資料完畢;

呼叫了interrupt()方法被打斷此刻的阻塞狀態;

這裡呢還有另外一種從執行狀態到就緒狀態的情況,就是執行緒間的通訊過程中發生的,我們來看一下 ;

執行狀態--->阻塞狀態:

1.當程式執行加鎖的**塊時,即執行synchronized修飾的方法抑或是synchronized包裹的**塊時,如果發現此時**塊鎖屬於當前自己的執行緒,那麼執行**塊;如果自己沒有鎖,就不能執行加鎖**塊,此時該執行緒進入鎖池等待其他執行緒將鎖資源釋放,如果等到鎖資源,此刻進入就緒狀態,等待cpu排程;

2.當鎖物件呼叫了wait()方法,此時該執行緒進入等待佇列等待其他程序的喚醒操作,當其他程式執行了notify()、notifyall()或者interrupt()方法時,此時執行緒由等待佇列轉入鎖池,開始執行1中的一系列操作;

這就是我對執行緒幾個狀態的初步認識,如有欠缺,請大家指出,謝謝!

執行緒生命週期及狀態

示例2 多執行緒執行狀態切換示例 public class demo2 system.out.println 沒呼叫start方法,thread1當前狀態 thread1.getstate tostring thread1.start thread.sleep 2000l 等待thread1執行結束...

執行緒的狀態和生命週期

1 新建狀態 create 建立乙個執行緒類的物件後,產生的新執行緒就進入新建狀態。如 thread myth new mythread 2 可執行狀態 runable 也叫就緒狀態,呼叫start 方法後進入。3 執行狀態 running 當處於就緒狀態的執行緒被呼叫並獲得了cpu等執行必須的資源...

執行緒Thread的生命週期以及狀態

由於早上沒有網,所以幾篇寫好的部落格就一起發啦。執行緒的生命週期以及狀態的圖大體上如下 其實 從這個圖中已經大體上能夠的獲取到執行緒的生命週期以及狀態了,但是還是詳細的說下吧 首先是通過new thread 方法例項化乙個新執行緒,然後改執行緒的物件呼叫start 方法,此時執行緒轉入到就緒狀態並且...