1. 程式人生 > >執行緒的基本概念、執行緒的基本狀態以及狀態之間的關係

執行緒的基本概念、執行緒的基本狀態以及狀態之間的關係

什麼是執行緒

一個執行緒是程序的一個順序執行流。同類的多個執行緒共享一塊記憶體空間和一組系統資源,執行緒本身有一個供程式執行時的堆疊。執行緒在切換時負荷小,因此,執行緒也被稱為輕負荷程序。一個程序中可以包含多個執行緒。

程序與執行緒的區別

一個程序至少有一個執行緒。執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程序的區別在於每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。


從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用來實現程序的排程和管理以及資源分配。

併發原理

多個執行緒或程序”同時”執行只是我們感官上的一種表現。事實上程序和執行緒是併發執行的,OS的執行緒排程機制將時間劃分為很多時間片段(時間片),儘可能均勻分配給正在執行的程式,獲取CPU時間片的執行緒或程序得以被執行,其他則等待。而CPU則在這些程序或執行緒上來回切換執行。微觀上所有程序和執行緒是走走停停的,巨集觀上都在執行,這種都執行的現象叫併發,但是不是絕對意義上的“同時發生。

執行緒狀態


1.新建

用new語句建立的執行緒物件處於新建狀態,此時它和其他java物件一樣,僅被分配了記憶體。


2.等待

當執行緒在new之後,並且在呼叫start方法前,執行緒處於等待狀態。

3.就緒

當一個執行緒物件建立後,其他執行緒呼叫它的start()方法,該執行緒就進入就緒狀態。處於這個狀態的執行緒位於Java虛擬機器的可執行池中,等待cpu的使用權。

4.執行狀態

處於這個狀態的執行緒佔用CPU,執行程式程式碼。在併發執行環境中,如果計算機只有一個CPU,那麼任何時刻只會有一個執行緒處於這個狀態。

只有處於就緒狀態的執行緒才有機會轉到執行狀態。

5.阻塞狀態

阻塞狀態是指執行緒因為某些原因放棄CPU,暫時停止執行。當執行緒處於阻塞狀態時,Java虛擬機器不會給執行緒分配CPU,直到執行緒重新進入就緒狀態,它才會有機會獲得執行狀態。

阻塞狀態分為三種:

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

2、同步阻塞:執行的執行緒在獲取物件同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把執行緒放入鎖池中。

3、其他阻塞:執行的執行緒執行Sleep()方法,或者發出I/O請求時,JVM會把執行緒設為阻塞狀態。當Sleep()狀態超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

6.死亡狀態

當執行緒執行完run()方法中的程式碼,或者遇到了未捕獲的異常,就會退出run()方法,此時就進入死亡狀態,該執行緒結束生命週期。