首頁 常見問題 線程的生命週期分幾個階段

線程的生命週期分幾個階段

Feb 21, 2023 pm 04:24 PM
執行緒 生命週期

5個階段:1、新建,是剛使用new方法,new出來的執行緒;2、就緒,是呼叫的執行緒的start()方法後,這時候執行緒處於等待CPU分配資源階段; 3.運行,當就緒的執行緒被調度並獲得CPU資源時,便進入運行狀態;4、阻塞,在運行狀態的時候,可能因為某些原因導致運行狀態的執行緒變成了阻塞狀態;5、銷毀,線程正常執行完畢後或線程被提前強制性的終止或出現異常導致結束,那麼線程就要被銷毀。

線程的生命週期分幾個階段

本教學操作環境:windows7系統、Dell G3電腦。

執行緒的生命週期包含5個階段,包括:新建、就緒、執行、阻塞、銷毀。完整的生命週期圖如下:

線程的生命週期分幾個階段

當執行緒進入運作狀態後,一般的作業系統是採用搶佔式的方式來讓執行緒取得CPU。所以CPU需要在多條執行緒之間切換,於是執行緒狀態也會多次在運作、阻塞、就緒之間切換。

1、新建(new)

:使用new方法,new出來線程,此時僅由JAVA虛擬機為其分配內存,並初始化成員變數的值。 此時只是個物件。

2、就緒(runnable)

就緒:就是呼叫的在執行緒的start()方法後,此時執行緒處於等待CPU分配資源階段,誰先搶的CPU資源,誰開始執行;
該執行緒進入就緒狀態,JAVA虛擬機會為其建立方法呼叫棧和程式計數器。執行緒的執行是由底層平台控制, 具有一定的隨機性。

3、執行(running)

#執行:當就緒的執行緒被調度並且取得CPU資源時,便進入運行狀態,run方法定義了執行緒的操作和功能;(當處於就緒狀態的執行緒獲得CPU,它就會執行run()方法)
對於一個單核心cpu(或者是一個核心)來說,只能同時執行一條指令,而JVM透過快速切換執行緒執行指令來達到多執行緒的,真正處理器就能同時處理一條指令,只是這種切換速度很快,我們根本不會感知到。為了執行緒切換後能恢復到正確的執行位置,每個執行緒都有一個獨立的程式計數器,各條執行緒之間計數器互不影響,獨立儲存。
當一個執行緒開始運作後,它不可能一直持有CPU(除非該執行緒執行體非常短,瞬間就執行結束了)。所以,執行緒在執行過程中需要被中斷,目的是讓它執行緒獲得執行的CPU的機會。執行緒的調度細節取決於底層平台所採用的策略。

4、阻塞(blocked)

阻斷:在運作狀態的時候,可能因為某些原因導致運行狀態的執行緒變成了阻塞狀態。原因如下:

1.等待I/O流的输入输出
2.等待网络资源,即网速问题
3.调用sleep()方法,需要等sleep时间结束
4.调用wait()方法,需要调用notify()唤醒线程
5.其他线程执行join()方法,当前线程则会阻塞,需要等其他线程执行完。
登入後複製

狀態切換圖如下:

線程的生命週期分幾個階段

#5、銷毀(terminated )

如果執行緒正常執行完畢後或執行緒被提前強制性的終止或出現異常導致結束,那麼執行緒就要被銷毀,釋放資源。

1、run()/call()方法執行完成,執行緒正常結束;
2、執行緒拋出一個未捕獲的Exception或Error;
3、直接呼叫執行緒的stop( )方法結束該線程-此方法容易導致死鎖,通常不建議使用。

擴充知識:CPU時間片

        作業系統層面有個晶振,有點像和尚在不停的撞鐘,每隔很短很短的一段時間撞一次,將CPU的時間拆成一個一個的時間片;各個線程其實是不停的去搶一個個的時間片;時間片到點後,還是要重新搶(保證所有的執行緒都有機會搶到CPU去執行自己的邏輯;公平性)

新建狀態

我們來看下面一段程式碼:

Thread t1 = new Thread();
登入後複製

這裡的創建,只是在JAVA的這種程式語言層面被創建,而在作業系統層面,真正的線程還沒有被創建。只有當我們呼叫了 start() 方法之後,該執行緒才會被建立出來,進入Runnable狀態。只有當我們呼叫了 start() 方法之後,該執行緒才會被建立出來

更多相關知識,請造訪常見問題欄位!

以上是線程的生命週期分幾個階段的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

8核16線程是什麼意思? 8核16線程是什麼意思? Feb 02, 2023 am 11:26 AM

8核是指CPU有8顆物理核心,16線程是指CPU最多同時可以有16個執行緒處理任務。核心數和執行緒數是電腦CPU的重要效能指標,CPU的核心數越高處理速度就越高;執行緒數越多越有利於同時運行多個程序,因為執行緒數等同於在某個瞬間CPU能同時並行處理的任務數。多執行緒可最大限度地實現寬發射、亂序的超標量處理,提高處理器運算元件的使用率,緩和由於資料相關或Cache未命中帶來的存取記憶體延遲。

vue3改了幾個生命週期函數 vue3改了幾個生命週期函數 Jan 13, 2023 pm 05:57 PM

vue3改了4個生命週期函數。 Vue3組合式api取消了beforeCreated和created鉤子函數,採用steup鉤子代替,且裡面不能使用this。 Vue3裡面的組件銷毀的鉤子函數由destroyed和beforeDestroy換成了beforeUnmount和unmounted。

servlet生命週期分成幾個階段 servlet生命週期分成幾個階段 Feb 23, 2023 pm 01:46 PM

Servlet生命週期是指servlet從創建到毀滅的整個過程,可分為3個階段:1、初始化階段,呼叫init()方法實作Servlet的初始化工作;2、運行階段(處理請求),容器會為指定請求建立代表HTTP請求的ServletRequest對象和代表HTTP回應的ServletResponse對象,然後將它們作為參數傳遞給Servlet的service()方法;3、銷毀階段。

如何處理 C++ 函數指標的析構與生命週期管理? 如何處理 C++ 函數指標的析構與生命週期管理? Apr 17, 2024 pm 05:48 PM

在C++中,函數指標需要適當的析構和生命週期管理。可以透過以下方式實現:手動析構函數指針,釋放記憶體。使用智慧指針,如std::unique_ptr或std::shared_ptr,自動管理函數指標的生命週期。將函數指標綁定到對象,對像生命週期管理函數指標的析構。在GUI程式設計中,使用智慧指標或綁定到物件可確保回呼函數在適當的時候被析構,避免記憶體洩漏和不一致。

Vue3中的生命週期函數:快速掌握Vue3的生命週期 Vue3中的生命週期函數:快速掌握Vue3的生命週期 Jun 18, 2023 am 08:20 AM

Vue3是目前前端界最熱門的框架之一,而Vue3的生命週期函數是Vue3中非常重要的一部分。 Vue3的生命週期函數可以讓我們實現在特定的時機觸發特定的事件,增強了元件的高度可控性。本文將從Vue3的生命週期函數的基本概念、各個生命週期函數的作用和使用方法以及實現案例等方面進行詳細探究和講解,幫助讀者快速掌握Vue3的生命週期函數。一、Vue3的生命週期函數的

uniapp實作如何手動觸發元件的生命週期鉤子函數 uniapp實作如何手動觸發元件的生命週期鉤子函數 Oct 21, 2023 am 11:04 AM

Uniapp是一款跨平台的應用程式開發框架,可同時建構iOS、Android和Web應用。在應用開發過程中,組件的生命週期鉤子函數是非常重要的一部分,它們用於在特定的時間節點執行相應的操作。通常,元件的生命週期函數是在特定的事件觸發下自動執行的,例如頁面載入完成、元件進入視圖、元件從視圖中移除等。但是,有時我們需要手動觸發組件的生命週期鉤子函數,以便達到特定的

C++並發程式設計:如何避免執行緒飢餓和優先反轉? C++並發程式設計:如何避免執行緒飢餓和優先反轉? May 06, 2024 pm 05:27 PM

為避免執行緒飢餓,可以使用公平鎖確保資源公平分配,或設定執行緒優先權。為解決優先權反轉,可使用優先權繼承,即暫時提高持有資源執行緒的優先權;或使用鎖的提升,即提升需要資源執行緒的優先權。

如何控制 Golang 協程的生命週期? 如何控制 Golang 協程的生命週期? May 31, 2024 pm 06:05 PM

控制Go協程的生命週期可以透過以下方式:建立協程:使用go關鍵字啟動新任務。終止協程:等待所有協程完成,使用sync.WaitGroup。使用通道關閉訊號。使用上下文context.Context。