發現許多初學者把「進程」與「線程」搞混,導致後續學習併發編程時基礎不牢。趁著假期,用大白話徹底講清楚兩者區別。
進程:程序在數據集合上一次運行活動,是系統資源分配與調度的基本單位。(百度百科)
線程:進程內並發執行的代碼片段,是 CPU 調度與執行的基本單位。(百度百科)
定義雖準確,但太生硬。我們用生活場景類比:
| 維度 | 進程 | 線程 |
|---|---|---|
| 資源分配單位 | 是 | 否(共享進程資源) |
| CPU 調度單位 | 否 | 是 |
| 記憶體隔離 | 獨立地址空間 | 共享堆/方法區,私有棧/程序計數器 |
| 創建/切換開銷 | 大(需分配資源、建頁表) | 小(僅分配棧、PC 寄存器) |
| 通信方式 | IPC(管道、Socket、共享記憶體) | 直接讀寫共享變量、鎖、wait/notify |
| 最少數量 | 1 | 每進程至少 1 條(主線程) |
進程切換太重、通信太麻煩。線程輕量、共享記憶體、切換快,適合同一應用內部的並發任務(如 Web 服務器每請求一線程)。
進程/線程狀態轉換、上下文切換細節、Java 線程模型與 Thread 類源碼解讀。
拋磚引玉,歡迎指正交流。點個贊支持國產技術創作!