Java Thread有幾種狀態?
java thread的運行週期中, 有幾種狀態, 在 java.lang.Thread.State 中有詳細定義和說明:
NEW 狀態是指線程剛創建, 尚未啓動
RUNNABLE 狀態是線程正在正常運行中, 當然可能會有某種耗時計算/IO等待的操作/CPU時間片切換等, 這個狀態下發生的等待一般是其他系統資源, 而不是鎖, Sleep等
WAITING 這個狀態下是指線程擁有了某個鎖之後, 調用了他的wait方法, 等待其他線程/鎖擁有者調用 notify / notifyAll 一遍該線程可以繼續下一步操作, 這裏要區分 BLOCKED 和 WATING 的區別, 一個是在臨界點外面等待進入, 一個是在理解點裏面wait等待別人notify, 線程調用了join方法 join了另外的線程的時候, 也會進入WAITING狀態, 等待被他join的線程執行結束
TIMED_WAITING 這個狀態就是有限的(時間限制)的WAITING, 一般出現在調用wait(long), join(long)等情況下, 另外一個線程sleep後, 也會進入TIMED_WAITING狀態
TERMINATED 這個狀態下表示 該線程的run方法已經執行完畢了, 基本上就等於死亡了(當時如果線程被持久持有, 可能不會被回收)
從圖可以看出只有當線程處於Runnable這個大狀態時纔會被OS調度獲取到cpu時間切片,進而執行相應的線程任務。
而當線程調用了join wait sleep這幾個方法中的任何一個時,就會迫使線程推出OS調度而被掛起,所以說sleep一個線
程後線程其實是不參與CPU調度的。
那麼Sleep和Wait有什麼區別呢?最大的區別在於線程調用Sleep掛起後不會釋放自己所獲得的鎖,而Wait掛起時,線
程會釋放掉相應的鎖。
未完待續