Java線程狀態轉換

線程轉換圖


線程在它的生命週期中會處於各種不同的狀態:

新建、等待、就緒、運行、阻塞、死亡。
1 新建

用new語句創建的線程對象處於新建狀態,此時它和其他java對象一樣,僅被分配了內存。

2等待

當線程在new之後,並且在調用start方法前,線程處於等待狀態。   --2012-12-21

3 就緒

當一個線程對象創建後,其他線程調用它的start()方法,該線程就進入就緒狀態。處於這個狀態的線程位於Java虛擬機的可運行池中,等待cpu的使用權。
4 運行狀態
處於這個狀態的線程佔用CPU,執行程序代碼。在併發運行環境中,如果計算機只有一個CPU,那麼任何時刻只會有一個線程處於這個狀態。
 只有處於就緒狀態的線程纔有機會轉到運行狀態。
5 阻塞狀態
阻塞狀態是指線程因爲某些原因放棄CPU,暫時停止運行。當線程處於阻塞狀態時,Java虛擬機不會給線程分配CPU,直到線程重新進入就緒狀態,它纔會有機會獲得運行狀態。
6 死亡狀態
當線程執行完run()方法中的代碼,或者遇到了未捕獲的異常,就會退出run()方法,此時就進入死亡狀態,該線程結束生命週期。
 
 
由於java線程調度不是分時的,如果程序希望干預java虛擬機對線程的調度過程,從而明確地讓一個線程給另外一個線程運行的機會,可以採用以下的方法
    1 調整各個線程的優先級
    2 讓處於運行狀態的線程調用Thread.sleep(long time)方法 放棄CPU 進入阻塞狀態 

                                                           sleep方法可能拋出InterruptedException

       線程休眠後只能在指定的時間後使線程處於就緒狀態。(也就是等待cpu的調度)

    3 讓處於運行狀態的線程調用Thread.yield()方法 只會同優先級讓步或更高優先級讓步  進入就緒狀態
    4 讓處於運行狀態的線程調用另一個線程的join()方法

       當前運行的線程可以調用另一個線程的join()方法,當前運行的線程將轉到阻塞狀態,直至另一個線程運行結束,它纔會轉到就緒狀態 從而有機會恢復運行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章