執行緒物件在它的生命週期內經歷5個狀態

2021-10-03 19:14:22 字數 1378 閱讀 6240

乙個執行緒物件在它的生命週期內,需要經歷5個狀態。

▪ 新生狀態(new)

用new關鍵字建立乙個執行緒物件後,該執行緒物件就處於新生狀態。處於新生狀態的執行緒有自己的記憶體空間,通過呼叫start方法進入就緒狀態。

▪ 就緒狀態(runnable)

處於就緒狀態的執行緒已經具備了執行條件,但是還沒有被分配到cpu,處於「執行緒就緒佇列」,等待系統為其分配cpu。就緒狀態並不是執行狀態,當系統選定乙個等待執行的thread物件後,它就會進入執行狀態。一旦獲得cpu,執行緒就進入執行狀態並自動呼叫自己的run方法。有4中原因會導致執行緒進入就緒狀態:

1. 新建執行緒:呼叫start()方法,進入就緒狀態;

2. 阻塞執行緒:阻塞解除,進入就緒狀態;

3. 執行執行緒:呼叫yield()方法,直接進入就緒狀態;

4. 執行執行緒:jvm將cpu資源從本執行緒切換到其他執行緒。

▪ 執行狀態(running)

在執行狀態的執行緒執行自己run方法中的**,直到

1.呼叫其他方法而終止

2.等待某資源而阻塞

3.完成任務而死亡

如果在給定的時間片內沒有執行結束,就會被系統給換下來回到就緒狀態。也可能由於某些「導致阻塞的事件」而進入阻塞狀態。

▪ 阻塞狀態(blocked)

阻塞指的是暫停乙個執行緒的執行以等待某個條件發生(如某資源就緒)。

有4種原因會導致阻塞:

1. 執行sleep(int millsecond)方法,使當前執行緒休眠,進入阻塞狀態。當指定的時間到了後,執行緒進入就緒狀態。

2. 執行wait()方法,使當前執行緒進入阻塞狀態。當使用nofity()方法喚醒這個執行緒後,它進入就緒狀態。

3. 執行緒執行時,某個操作進入阻塞狀態,比如執行io流操作(read()/write()方法本身就是阻塞的方法)。只有當引起該操作阻塞的原因消失後,執行緒進入就緒狀態。

4. join()執行緒聯合: 當某個執行緒等待另乙個執行緒執行結束後,才能繼續執行時,使用join()方法。

▪ 死亡狀態(terminated)

死亡狀態是執行緒生命週期中的最後乙個階段。執行緒死亡的原因有兩個。

1.是正常執行的執行緒完成了它run()方法內的全部工作;

2.是執行緒被強制終止。如通過執行stop()或destroy()方法來終止乙個執行緒(注:stop()/destroy()方法已經被jdk廢棄,不推薦使用)。

當乙個執行緒進入死亡狀態以後,就不能再回到其它狀態了。

執行緒的生命週期

1.新建 threadd thread new thread runnable 2.就緒 thread.start 將執行緒放入就緒等待佇列中,等待cpu時間片的分配 3.執行 獲取到cpu時間片,一直執行到結束,除非有優先順序更高執行緒進入或者自動放棄cpu資源 4.死亡 正常結束或被其他執行緒殺...

執行緒的生命週期

如上圖 new乙個thread,則執行緒處於新建狀態。呼叫start 則處於就緒狀態,至於什麼時候執行,屬於系統排程的事情了,當run 或者call 執行體執行完成後,處於死亡狀態。執行狀態的執行緒,可能遇到以下情況而被阻塞 sleep 方法 io阻塞 等待同步鎖 等待通知 suspend 呼叫yi...

執行緒的生命週期

執行緒的生命週期主要分為 新建 可執行 執行 阻塞 終止這幾個狀態。下面展現其狀態轉化框架圖。sleep 使比其優先順序低的執行緒執行 不占用cpu yield 只讓給同優先順序的縣城執行,將自己置於可執行執行緒池。物件鎖保持 join 形式 t.join 等待執行緒t結束,執行緒進入可執行狀態。i...