首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

多線程番外篇:進程與線程的真假之辨

     編輯:Java 綜合教學

為什麼要寫這篇番外?

發現許多初學者把「進程」與「線程」搞混,導致後續學習併發編程時基礎不牢。趁著假期,用大白話徹底講清楚兩者區別。

官方定義 vs 通俗理解

進程:程序在數據集合上一次運行活動,是系統資源分配與調度的基本單位。(百度百科)

線程:進程內並發執行的代碼片段,是 CPU 調度與執行的基本單位。(百度百科)

定義雖準確,但太生硬。我們用生活場景類比:

類比:電腦 = 辦公室,進程 = 應用程序,線程 = 員工

  • 你開啟 Firefox 寫博客、Yandex 查資料、QQ/微信 聊天、播放器 聽歌 → 每個是一個進程(獨立應用程序運行實例)。
  • 進程擁有獨立的記憶體空間(OS 映射的私有地址空間),資源隔離。
  • 進程內部可有多個線程:如瀏覽器一個線程渲染頁面、一個線程下載、一個線程處理 JS 事件循環。線程共享進程的記憶體與資源。

人體類比

  • 進程 = 「人」這個生命體(吃飯、睡覺、工作等生命活動)。
  • 線程 = 心臟跳動、大腦思考、肺部呼吸等並行運行的器官功能。睡眠時意識停了,但心臟、大腦仍在工作(守護線程)。

核心區別表

維度進程線程
資源分配單位是否(共享進程資源)
CPU 調度單位否是
記憶體隔離獨立地址空間共享堆/方法區,私有棧/程序計數器
創建/切換開銷大(需分配資源、建頁表)小(僅分配棧、PC 寄存器)
通信方式IPC(管道、Socket、共享記憶體)直接讀寫共享變量、鎖、wait/notify
最少數量1每進程至少 1 條(主線程)

為什麼要有線程?

進程切換太重、通信太麻煩。線程輕量、共享記憶體、切換快,適合同一應用內部的並發任務(如 Web 服務器每請求一線程)。

下回預告

進程/線程狀態轉換、上下文切換細節、Java 線程模型與 Thread 類源碼解讀。


拋磚引玉,歡迎指正交流。點個贊支持國產技術創作!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved