標籤:佔用 使用權 notify ... 實現 dead 執行 系統 .com
一:線程的狀態以及變化圖
Java中線程中狀態可分為五種:New(建立狀態),Runnable(就緒狀態),Running(運行狀態),Blocked(阻塞狀態),Dead(死亡狀態)。
New:建立狀態,當線程建立完成時為建立狀態,即new Thread(...),還沒有調用start方法時,線程處於建立狀態。
Runnable:就緒狀態,當調用線程的的start方法後,線程進入就緒狀態,等待CPU資源。處於就緒狀態的線程由Java運行時系統的線程發送器(thread scheduler)來調度。
Running:運行狀態,就緒狀態的線程擷取到CPU執行權以後進入運行狀態,開始執行run方法。
Blocked:阻塞狀態,線程沒有執行完,由於某種原因(如,I/O操作等)讓出CPU執行權,自身進入阻塞狀態。
Dead:死亡狀態,線程執行完成或者執行過程中出現異常,線程就會進入死亡狀態。
(圖來自牛客網,如有冒犯,請告知刪除。)
二:線程間協作通訊以及其導致的狀態變化
1:線程間的同步協作
由syncrhoized同步鎖、ReentrantLock、ReadWriteLock等待同步機制,實現線程之間的同步。
線程獲得鎖則進入就緒態,等待CPU調度進入運行態;
線程申請被佔用的鎖,則進入阻塞態,讓出CPU使用權。直到獲得該鎖後,重新進入就緒態,等待CPU調度進入運行態。
2:線程間的通訊協作
在獲得鎖而執行的線程執行時,執行到某處時需要申請同一把鎖的其他線程先執行,此時就需要讓出同步鎖以及CPU(進入阻塞態),讓其他線程先擷取同步鎖以及CPU而執行。直到其他線程執行完並釋放同步鎖後通知它喚醒(就緒態),才接著申請同步鎖以及CPU而繼續執行下去(運行態)。
這個線程之間 讓出資源、掛起、喚醒 就是通過線程的通訊來實現的。
syncrhoized加鎖的線程的wait()/notify()/notifyAll()以及ReentrantLock加鎖的線程的Condition調用await()/signal()/signalAll()就是具體的線程通訊。
3:線程自身的動作
線程自身可以通過調用 sleep() 方法進入阻塞態,暫時讓出CPU資源(但是不釋放鎖),休眠時間過後自動回復就緒態等待CPU調度執行;
線程自身可以通過調用 yield() 方法由運行態變為就緒態;這個過程稱為“讓步”,即正在啟動並執行線程讓出CPU給就緒態中的線程先執行一下,自己則回到就緒態中等待CPU再次調度自己執行;
線程可以在自身執行過程中,通過 其他線程對象.join() 方法把已經啟動的其他線程先執行完 ,再繼續執行自身的餘下操作。可以通過這個方法來實現線程之間順序執行。
Java多線程之線程的狀態以及線程間協作通訊導致的狀態變換