一、後台—— 執行緒屬性,非獨立實體
後台執行緒 是執行緒的一種屬性(`Thread.setDaemon(true)` / `IsBackground`),不是獨立的程式實體。
- 前台執行緒:JVM/進程必須等待所有前台執行緒結束才退出(如 `main` 執行緒、使用者介面執行緒)。
- 後台執行緒:服務型執行緒(GC、自動儲存、監聽器)。當所有前台執行緒結束,進程直接退出,所有後台執行緒被強制終止,不會執行 `finally` 區塊,資源可能來不及釋放。
比喻:前台執行緒是「股東會議」,後台執行緒是「保潔阿姨」。會議結束(前台結束),公司鎖門走人,保潔阿姨還在擦窗也得趕出去。
二、進程—— 資源擁有者,獨立地址空間
- 定義:程式執行的實例,是系統資源分配(記憶體、檔案句柄、Socket、CPU 時間片)的基本單位。
- 隔離性:擁有獨立虛擬地址空間。一個進程崩潰(段錯誤),不影響其他進程(保護模式下)。
- 開銷:建立/切換/銷毀進程涉及頁表切換、TLB 刷新、核心態切換,**開銷大,效率低**。
- 通訊:需 IPC(管道、Socket、共享記憶體、訊息佇列),程式設計複雜。
三、執行緒—— CPU 調度單位,共享進程資源
- 定義:進程內的一條執行路徑,是 CPU 調度的基本單位。
- 共享:同進程內執行緒共享堆積、全域變數、程式碼段、檔案描述符;私有棧、PC 暫存器、區域變數。
- 輕量:建立/切換只需保存/恢復暫存器與棧指針,**開銷小,併發性高**。
- 脆弱性:任一執行緒非預期退出(如空指標、除零),整個進程隨之終止(所有執行緒被強制結束)。
四、核心對比表
| 維度 | 進程 | 執行緒 | 後台 |
| 本質 | 資源容器、獨立實體 | 執行路徑、調度單元 | 執行緒屬性(Daemon/Background) |
| 記憶體 | 獨立地址空間 | 共享進程堆/全域,私有棧 | 無獨立記憶體,屬於所屬執行緒 |
| 崩潰影響 | 隔離,不波及他人 | 拖垮整個進程 | 進程退出時被強制終止 |
| 切換開銷 | 大(頁表、MMU、核心態) | 小(暫存器、棧指針) | 無額外開銷 |
| 適用場景 | 高安全、穩定性要求、多核並行 | 高併發、共享資料、輕量任務 | 輔助性、非關鍵、可丟棄任務 |
五、工程選型指南
- 需共享大量記憶體、頻繁通訊 → 多執行緒(如 Web 伺服器 Worker、遊戲邏輯幀)。
- 模組故障必須隔離、安全沙箱、不同使用者權限 → 多進程(如 Chrome 瀏覽器分進程、Android 四大組件跨進程)。
- 後台任務:日誌上傳、快取清理、心跳檢測 → 標記為 Daemon/Background 執行緒,主流程退出自動收尾。
理解三者本質區別,是寫出高併發、高穩定、資源可控系統軟體的前提。