Java併發基礎 執行緒狀態及轉換

2021-08-16 22:05:25 字數 1012 閱讀 4145

每個執行緒都有狀態,表示當前的執行緒是否在執行或者是等待某些事情的發生等。

本文先對執行緒的幾個狀態進行解釋,然後再說明執行緒如何在這幾個狀態之間跳轉。

作業系統在實際執行過程中,可能有很多個執行緒一直同時在執行。相對單個cpu來說,同一時間執行的執行緒數只能有乙個。但如果所有執行緒都排隊等待上一線程處理完畢後再執行下一線程,會帶來很多問題,如一些非關鍵的執行緒長期占用cpu,而導致某些關鍵執行緒等待時間很長等;在這種情況下,作業系統一般對cpu的使用按執行緒進行分配,限定每個執行緒的連續執行時間;也就是說,每個執行緒在執行一段時間後,必須釋放cpu,所有執行緒一起按某些規則競爭cpu的下次分片使用時間。

執行緒有以下幾個狀態:

執行緒在上述幾個狀態之間可以相互轉換,其狀態轉換圖如下所示:

當執行緒呼叫start方法時,從新建(new)狀態過度到就緒(runnable)狀態;

當執行緒在就緒狀態時,如果獲取到了足夠的作業系統資源(如cpu等),它將會從就緒狀態進入到執行狀態;

這個過程是由作業系統進行排程的,開發人員不能也無需處理這種狀態的轉換。

當執行緒在執行過程中,當前所分配的作業系統資源(如cpu時間片等)使用完畢,則會由執行狀態轉換到就緒狀態。

此過程也是由作業系統排程控制,開發人員一般無需關注。除非某些場景下cpu等作業系統資源不夠導致執行緒執行時間變長時,可以考慮對作業系統的某項受限資源進行擴充套件以提高效率。

開發人員也可以通過thread.yeild方法放棄當前的資源,此時作業系統將重新選擇執行緒執行,當前執行緒的狀態也會從執行轉換成 就緒;但也有可能作業系統立即選擇了剛放棄的執行緒再次執行。

執行緒執行過程中,如果遇到以下事件將會進入阻塞狀態:

執行緒在阻塞狀態時,根據其阻塞的原因,如果遇到對應的某些事件發生,則會由阻塞狀態進入就緒狀態。

如它阻塞的原因是呼叫鎖的lock方法,那麼在獲取到鎖時將會進入就緒狀態。

當執行緒執行完畢時,會由執行狀態跳轉到死亡狀態。

java併發程式設計基礎 執行緒狀態及相互轉換

1 thread原始碼state,篇幅所限,就省略部分注釋 2 轉態解釋 初始 new 新建立了乙個執行緒物件,但還沒有呼叫start 方法。執行 runnable 處於可執行狀態的執行緒正在jvm中執行,但它可能正在等待來自作業系統的其他資源,例如處理器。阻塞 blocked 執行緒阻塞於sync...

java多執行緒 執行緒狀態轉換

img 1.新建 new 新建立了乙個執行緒物件。2.可執行 runnable 執行緒物件建立後,其他執行緒 比如main執行緒 呼叫了該物件的start 方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取cpu 的使用權 3.執行 running 可執行狀態 runnable 的...

Java 多執行緒狀態轉換

圖中是執行緒執行的基本狀態 執行緒呼叫start 方法開始後,就進入到可執行狀態,隨著cpu的資源排程在執行和可執行之間切換 遇到阻塞則進入阻塞狀態。二三的狀態圖中只不過執行緒被阻塞的情況分為很多種,後面的圖是細化說明。當乙個執行緒執行了start方法後,不代表這個執行緒就會立即被執行,只代表這個執...