重新認識Java線程的概念

Java Thread有幾種狀態?

java thread的運行週期中, 有幾種狀態, 在 java.lang.Thread.State 中有詳細定義和說明:

NEW 狀態是指線程剛創建, 尚未啓動

RUNNABLE 狀態是線程正在正常運行中, 當然可能會有某種耗時計算/IO等待的操作/CPU時間片切換等, 這個狀態下發生的等待一般是其他系統資源, 而不是鎖, Sleep等

BLOCKED  這個狀態下, 是在多個線程有同步操作的場景, 比如正在等待另一個線程的synchronized 塊的執行釋放, 或者可重入的 synchronized塊裏別人調用wait() 方法, 也就是這裏是線程在等待進入臨界區

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掛起時,線

程會釋放掉相應的鎖。


未完待續




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