執行緒7種狀態的相互轉換

2021-05-23 12:24:53 字數 1256 閱讀 7102

今天有同事問到執行緒的問題,自己突然就有點蒙了,只模糊的記得個大概。

當初學習執行緒的時候把這7個狀態記得比自己名字還熟悉

還把這7個狀態編成了一段悽慘而美麗的愛情故事

沒想到如今卻只能記得個大概

真驗證了「好記性不如爛筆頭」的真理

還是趕快回憶一下吧

先從開始

小小的作下解釋:

1、執行緒的實現有兩種方式,一是繼承thread類,二是實現runnable介面,但不管怎樣,當我們new了這個物件後,執行緒就進入了初始狀態

2、當該物件呼叫了start()方法,就進入可執行狀態

3、進入可執行狀態後,當該物件被作業系統選中,獲得cpu時間片就會進入執行狀態

4、進入執行狀態後情況就比較複雜了

4.1、run()方法或main()方法結束後,執行緒就進入終止狀態

4.2、當執行緒呼叫了自身的sleep()方法或其他執行緒的join()方法,就會進入阻塞狀態(該狀態既停止當前執行緒,但並不釋放所占有的資源)。當sleep()結束或join()結束後,該執行緒進入可執行狀態,繼續等待os分配時間片;

4.3、執行緒呼叫了yield()方法,意思是放棄當前獲得的cpu時間片,回到可執行狀態,這時與其他程序處於同等競爭狀態,os有可能會接著又讓這個程序進入執行狀態;

4.4、當執行緒剛進入可執行狀態(注意,還沒執行),發現將要呼叫的資源被synchroniza(同步),獲取不到鎖標記,將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他執行緒在等待獲取鎖標記,這時它們處於佇列狀態,既先到先得),一旦執行緒獲得鎖標記後,就轉入可執行狀態,等待os分配cpu時間片;

4.5、當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyall()方法才能被喚醒(由於notify()只是喚醒乙個執行緒,但我們由不能確定具體喚醒的是哪乙個執行緒,也許我們需要喚醒的執行緒不能夠被喚醒,因此在實際使用時,一般都用notifyall()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池,等待獲取鎖標記。

總算全部回憶了一遍jdk1.5在api的使用上有了較好的改進,效率得到很大的提高,不過幾個狀態轉換的原理還是一樣。

額……不過那一段悽慘而美麗的愛情故事還沒完全想起來,那天全部回憶起來了在寫吧。

執行緒7種狀態的相互轉換

小小的作下解釋 1 執行緒的實現有兩種方式,一是繼承thread類,二是實現runnable介面,但不管怎樣,當我們new了這個物件後,執行緒就進入了初始狀態 2 當該物件呼叫了start 方法,就進入可執行狀態 3 進入可執行狀態後,當該物件被作業系統選中,獲得cpu時間片就會進入執行狀態 4 進...

執行緒的7種狀態及相互轉換

今天有同事問到執行緒的問題,自己突然就有點蒙了,只模糊的記得個大概。當初學習執行緒的時候把這7個狀態記得比自己名字還熟悉 還把這7個狀態編成了一段悽慘而美麗的愛情故事 沒想到如今卻只能記得個大概 真驗證了 好記性不如爛筆頭 的真理 還是趕快回憶一下吧 小小的作下解釋 1 執行緒的實現有兩種方式,一是...

Java程式設計體驗 執行緒的7種狀態及相互轉換

先從開始 小小的作下解釋 1 執行緒的實現有兩種方式,一是繼承thread類,二是實現runnable介面,但不管怎樣,當我們new了這個物件後,執行緒就進入了初始狀態 2 當該物件呼叫了start 方法,就進入可執行狀態 3 進入可執行狀態後,當該物件被作業系統選中,獲得cpu時間片就會進入執行狀...