Thread詳解3 執行緒的狀態及幾個簡單方法

2021-07-10 18:57:35 字數 2401 閱讀 9681

新建狀態(new):新建立了乙個執行緒物件。

就緒狀態(runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。

執行狀態(running):就緒狀態的執行緒獲取了cpu,執行程式**。

阻塞狀態(blocked):阻塞狀態是執行緒因為某種原因放棄cpu使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

(一)、等待阻塞:執行的執行緒執行wait()方法,jvm會把該執行緒放入等待池中。

(二)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒占用,則jvm會把該執行緒放入鎖池中。

(三)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了i/o請求時,jvm會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者i/o處理完畢時,執行緒重新轉入就緒狀態。

死亡狀態(dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行),此操作受到系統計時器和排程程式精度和準確性的影響。該執行緒不丟失任何監視器的所屬權。

thread.yield()方法作用是:暫停當前正在執行的執行緒物件,並執行其他執行緒。yield()應該做的是讓當前執行執行緒回到可執行狀態,以允許具有相同優先順序的其他執行緒獲得執行機會。因此,使用yield()的目的是讓相同優先順序的執行緒之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的執行緒還有可能被執行緒排程程式再次選中。

結論:yield()從未導致執行緒轉到等待/睡眠/阻塞狀態。在大多數情況下,yield()將導致執行緒從執行狀態轉到可執行狀態,但有可能沒有效果。

在很多情況下,主線程生成並起動了子執行緒,如果子執行緒裡要進行大量的耗時的運算,主線程往往將於子執行緒之前結束,但是如果主線程處理完其他的事務後,需要用到子執行緒的處理結果,也就是主線程需要等待子執行緒執行完成之後再結束,這個時候怎麼辦?

想博主第一次接觸多執行緒的時候,還不知有join()這個方法,用的辦法是讓主線程sleep 10秒種嘛,估摸著那個時候子執行緒已經結束計算了。是不是很傻,很沒有效率?這個時候join()出馬了。

「等待該執行緒終止」,這裡需要理解的就是該執行緒是指的主線程等待子執行緒的終止。也就是在子執行緒呼叫了join()方法後面的**,只有等到子執行緒結束了才能執行。來個對比的例子:

**1:

public

class

mythread1

extends

thread catch (interruptedexception e) }}

public

static

void

main(string args)

}

輸出

thread-0

thread-1

thread-0

thread-1

thread-0

thread-1

thread-0

thread-1

thread-0

thread-1

thread-0

thread-1

**2:

…… ……

t1.start();

try catch (interruptedexception e)

t2.start();

…… ……

輸出

thread-0

thread-0

thread-0

thread-0

thread-0

thread-0

thread-1

thread-1

thread-1

thread-1

thread-1

thread-1

is suspended and makes no further

* progress unless and

until

itis resumed.

也就是說,一旦呼叫suspend,執行緒會被立刻凍結,而且【不會有任何後續步驟】,這就是問題所在:如果目標執行緒掛起時在保護關鍵系統資源的監視器上保持有鎖,則在目標執行緒重新開始以前任何執行緒都不能訪問該資源。如果重新開始目標執行緒的執行緒想在呼叫 resume 之前鎖定該監視器,則會發生死鎖。這類死鎖通常會證明自己是「凍結」的程序。

Thread執行緒類及多執行緒

1.程序 執行緒 併發 並行是什麼?1 程序 作業系統中可以執行多個任務 程式 這些執行的任務 程式 被稱為程序。程式的執行產生程序 記憶體空間 程式執行的堆疊 可以這樣說,程序是作為作業系統分配資源的基本單位。3 併發 執行緒是併發執行的。作業系統將時間化分為若干個片段 時間片 盡可能的均勻分配給...

多執行緒 Thread類詳解

thread類是j a中實現多執行緒程式設計的基礎類。本節就來介紹下thread類的常用api和常見用法。thread.activecount 這個方法用於返回當前執行緒的執行緒組中活動執行緒的數量,返回的值只是乙個估計值,因為當此方法遍歷內部資料結構時,執行緒數可能會動態更改。thread.che...

Thread03之多執行緒執行緒狀態

demo 當執行緒被建立並啟動以後,它既不是一啟動就進入了執行狀態,也不是一直處於執行狀態。我們不需要去研究這幾種狀態的實現原理,我們只需知道在做執行緒操作中存在這樣的狀態。那我們怎麼去理解這幾個狀態呢,新建與被終止還是很容易理解的,我們就研究一下執行緒從runnable 可執行 狀態與非執行狀態之...