1. 程式人生 > >執行緒Thread的生命週期以及狀態

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

      由於早上沒有網,所以幾篇寫好的部落格就一起發啦。

      上2篇部落格中記錄了,執行緒和程序的異同,操作執行緒的常用方法的區別,其實,一個執行緒的生命週期在整個程序中是非常的重要的,它不僅僅關係到一個程序的效率,更能幫助我們靈活的使用執行緒。

      執行緒的生命週期以及狀態的圖大體上如下:

     

   其實:從這個圖中已經大體上能夠的獲取到執行緒的生命週期以及狀態了,但是還是詳細的說下吧:

        首先是通過new Thread()方法例項化一個新執行緒,然後改執行緒的物件呼叫start()方法,此時執行緒轉入到就緒狀態並且等待cpu的排程,可能不是馬上就排程到此執行緒的,這和cpu的輪詢策略有關,例如時間片輪詢策略。

      執行緒執行,執行run方法,如果中途沒被其他操作執行緒的方法操作的話,那麼run方法執行完畢,執行緒死亡。

       如果線上程run的過程中,執行了別的操作執行緒的方法,如果有呼叫sleep方法的執行緒,改執行緒會暫停一段時間,而且不會釋放資源鎖,,也就是說如果有synchronized同步塊,其它執行緒仍然是不能訪問共享資料的。而且sleep方法給其它的執行緒執行的機會,而且是不考慮其它執行緒的優先順序的。當前執行緒轉入睡眠狀態,直到睡眠結束。如果當前執行緒呼叫的是其它執行緒的join方法,當前的程序狀態將轉入到掛起狀態,知道另外一執行緒執行結束,該執行緒才繼續執行。噹噹前執行緒是等待IO輸入,則當前執行緒進入等待狀態,知道輸入流結束。

       如果當前執行緒執行了yeild方法,當前執行緒進入到就緒狀態,並讓出cpu的控制權,cpu執行別的執行緒。

       如果在run方法中,當前執行緒執行了wait()方法,使當前執行緒暫停,當前執行緒進入等待狀態,在其他執行緒呼叫此物件的 notify() 方法或者 notifyAll()方法,該執行緒進入阻塞狀態,因為是在同步塊中進行的,所以要等待當前資源釋放資源,然後進入解鎖,到就緒狀態。

      如果是執行緒加了同步鎖的話,該執行緒對資源獨享,其它執行緒想操作此資料,將進入到阻塞狀態,知道同步鎖的執行緒操作完資源,進行解鎖,從而轉入到就緒狀態。