線程在它的生命週期中會處於各類不一樣的狀態:新建、等待、就緒、運行、阻塞、死亡。
一、新建
用new語句建立的線程對象處於新建狀態,此時它和其餘java對象同樣,僅被分配了內存。
二、等待
當線程在new以後,而且在調用start方法前,線程處於等待狀態。
三、就緒
當一個線程對象建立後,其餘線程調用它的start()方法,該線程就進入就緒狀態。處於這個狀態的線程位於Java虛擬機的可運行池中,等待cpu的使用權。
四、運行狀態
處於這個狀態的線程佔用CPU,執行程序代碼。在併發運行環境中,若是計算機只有一個CPU,那麼任什麼時候刻只會有一個線程處於這個狀態。
只有處於就緒狀態的線程纔有機會轉到運行狀態。
五、阻塞狀態
阻塞狀態是指線程由於某些緣由放棄CPU,暫時中止運行。當線程處於阻塞狀態時,Java虛擬機不會給線程分配CPU,直到線程從新進入就緒狀態,它纔會有機會得到運行狀態。
六、死亡狀態
當線程執行完run()方法中的代碼,或者遇到了未捕獲的異常,就會退出run()方法,此時就進入死亡狀態,該線程結束生命週期。
因爲java線程調度不是分時的,若是程序但願干預java虛擬機對線程的調度過程,從而明確地讓一個線程給另一個線程運行的機會,能夠採用如下的方法
一、調整各個線程的優先級
二、讓處於運行狀態的線程調用Thread.sleep(long time)方法 放棄CPU 進入阻塞狀態
sleep方法可能拋出InterruptedException
線程休眠後只能在指定的時間後使線程處於就緒狀態。(也就是等待cpu的調度)
三、讓處於運行狀態的線程調用Thread.yield()方法,只會同優先級讓步或更高優先級讓步(進入就緒狀態)
四、讓處於運行狀態的線程調用另外一個線程的join()方法
當前運行的線程能夠調用另外一個線程的join()方法,當前運行的線程將轉到阻塞狀態,直至另外一個線程運行結束,它纔會轉到就緒狀態 從而有機會恢復運行。vue
經過一下幾種途徑中的一種,線程能夠從被阻塞狀態到可運行狀態。
一、線程被置於睡眠狀態,且已經通過指定的毫秒數。
二、線程正在等待I/O操做的完成,且該操做已經完成。
三、線程正在等待另外一個線程所持有的鎖,且另外一個線程已經釋放該鎖的全部權;(也有可能等待超時。當超時發生時,線程解除阻塞。)
四、線程正在等待某個觸發條件,且另外一個線程發出了信號代表條件已經發生了變化。(若是爲線程的等待設置了一個超時,那麼當超時發生時該線程將解除阻塞。)
五、線程已經被掛起,且有人調用了它的resume方法。不過因爲suspend方法已通過時,resume方法也就隨之被棄用了,你不該該在本身的代碼裏調用它。(如今應該用sleep取而代之。)
java
海量視頻分享 java dubbo mysql vuemysql