線程的基本概念、線程的基本狀態以及狀態之間的關系


什么是線程

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

 

進程與線程的區別

一個進程至少有一個線程。線程的划分尺度小於進程,使得多線程程序的並發性高。另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

 

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

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

 

並發原理

多個線程或進程”同時”運行只是我們感官上的一種表現。事實上進程和線程是並發運行的,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()方法,此時就進入死亡狀態,該線程結束生命周期。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM