多線程基本概念_程序_進程_線程
程序(Program):是一個靜態的概念,是一個指令的集合。
進程Process:(正在執行中的程序)是一個靜態的概念進程是程序的一次靜態態執行過程, 佔用特定的地址空間.每個進程都是獨立的,由 3 部分組成 cpu,data,code。
線程:是進程中一個「單一的連續控制流程」 (a singlesThread,equential flow of control)/執行路徑。線程又被稱為輕量級進程(lightweight process)。
(1) 進程與線程之間區別?
根本區別:
- 進程 :是作為資源分配的單位。
- 線程:是調度和執行的單位。
開銷 :
- 進程間的切換會有較大的開銷。
- 線程每個線程有獨立的運行棧和程序計數器(PC),線程切換的開銷小。
所處環境:
- 在操作系統中能同時運行多個任務(程序)。
- 線程在同一應用程序中有多個順序流同時執行。
分配內存:
- 系統在運行的時候會為每個進程分配不同的內存區域。
- 線程 除了 CPU 之外,不會為線程分配內存(線程所使用的資源是它所屬的進程的資源), 線程組只能共享資源。
實現多線程的方法:
1. 通過繼承Thread類實現多線程
- 繼承Thread類
- 重寫run()方法
- 通過start()方啟動線程
Java 中的類是單繼承的,一旦繼承了 Thread 類,就不允許再去繼承其它的類
2.通過實現介面Runnable實現多線程
- 編寫類實現 Runnable 介面
- 實現 run()方法
- 通過 Thread 類的 start()方法啟動線程
線程狀態、線程的生命週期
用 new 關鍵字建立一個線程後,該線程對象就處於新生狀態。處於新生狀態的線程有 自己的內存空間,通過調用start()方法進入就緒狀態。
處於就緒狀態線程具備了運行條件,但還沒分配到 CPU,處於線程就緒隊列,等待系統為其分配 CPU。當系統選定一個等待執行的線程後,它就會從就緒狀態進入執行狀態,該動作稱為「CPU 調度。
在運行狀態的線程執行自己的 run 方法中代碼,直到等待某資源而阻塞或完成任何而死亡。如果在給定的時間片內沒有執行結束,就會被系統給換下來回到等待執行狀態。
處於運行狀態的線程在某些情況下,如執行了 sleep(睡眠)方法,或等待 I/O 設備等資源,將讓出 CPU 並暫時停止自己運行,進入阻塞狀態。在阻塞狀態的線程不能進入就緒隊列。只有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O 設備空閑下來,線程便轉入就緒狀態,重新到就緒隊列中排隊等待,被系統選中後從原來停止的位置開始繼續執行。
死亡狀態是線程生命週期中的最後一個階段。線程死亡的原因有三個,一個是正常運行的線程完成了它的全部工作;另一個是線程被強制性地終止,如通過 stop 方法來終止一個線程【不推薦使用】;三是線程拋出未捕獲的異常。