Java线程的概念:什么是线程?
- 進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1–n個線程。(進程是資源分配的最小單位)
- 線程:同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。(線程是cpu調度的最小單位)
世間萬物都可以同時完成很多工作。例如,人體可以同時進行呼吸、血液循環、思考問題等活動。用戶既可以使用計算機聽歌,也可以編寫文檔和發送郵件,而這些活動的完成可以同時進行。這種同時執行多個操作的“思想”在 Java 中被稱為并發,而將并發完成的每一件事稱為線程。
在 Java 中,并發機制非常重要,但并不是所有程序語言都支持線程。在以往的程序中,多以一個任務完成以后再進行下一個任務的模式進行,這樣下一個任務的開始必須等待前一個任務的結束。Java 語言提供了并發機制,允許開發人員在程序中執行多個線程,每個線程完成一個功能,并與其他線程并發執行。這種機制被稱為多線程。
多線程是非常復雜的機制,比如同時閱讀 3 本書。首先閱讀第 1 本第 1 章,然后再閱讀第 2 本第 1 章,再閱讀第 3 本第 1 章,接著回過頭閱讀第 1 本第 2 章,以此類推,就體現了多線程的復雜性。
進程:一個進程包括由操作系統分配的內存空間,包含一個或多個線程。一個線程不能獨立的存在,它必須是進程的一部分。一個進程一直運行,直到所有的非守護線程都結束運行后才能結束。
既然多線程這么復雜,那么它在操作系統中是怎樣工作的呢?其實,Java 中的多線程在每個操作系統中的運行方式也存在差異,在此以 Windows 操作系統為例介紹其運行模式。
Windows 系統是多任務操作系統,它以進程為單位。一個進程是一個包含有自身地址的程序,每個獨立執行的程序都稱為進程,也就是正在執行的程序。圖 1 所示為 Windows 7 系統下使用任務管理器查看進程的結果。
系統可以分配給每個進程一段有限的執行 CPU 的時間(也稱為 CPU 時間片),CPU 在這段時間中執行某個進程,然后下一個時間段又跳到另一個進程中去執行。由于 CPU 切換的速度非常快,給使用者的感受就是這些任務似乎在同時運行,所以使用多線程技術后,可以在同一時間內運行更多不同種類的任務。
圖 2 的左圖是單線程環境下任務 1 和任務 2 的執行模式。任務 1 和任務 2 是兩個完全獨立、互不相關的任務,任務 1 是在等待遠程服務器返回數據,以便進行后期的處理,這時 CPU 一直處于等待狀態,一直在“空運行”。如果任務 2 是在 5 秒之后被運行,雖然執行任務 2 用的時間非常短,僅僅是 1 秒,但必須在任務1運行結束后才可以運行任務 2。由于運行在單任務環境中,所以任務 2 有非常長的等待時間,系統運行效率大幅降低。
單任務的特點就是排隊執行,也就是同步,就像在 cmd 中輸入一條命令后,必須等待這條命令執行完才可以執行下一條命令一樣。這就是單任務環境的缺點,即 CPU 利用率大幅降低。
圖 2 的右側則是多線程環境下的執行模式。從中可以發現,CPU 完全可以在任務 1 和任務 2 之間來回切換,使任務 2 不必等到 5 秒再運行,系統的運行效率大大得到提升。這就是要使用多線程技術、要學習多線程的原因。
那么什么是線程呢?線程可以理解成是在進程中獨立運行的子任務。比如,QQ.exe 運行時就有很多的子任務在同時運行。像好友視頻、下載文件、傳輸數據、發送表情等,這些不同的任務或者說功能都可以同時運行,其中每一項任務完全可以理解成是“線程”在工作,傳文件、聽音樂、發送圖片表情等功能都有對應的線程在后臺默默地運行。
線程與進程的區別:
總結
以上是生活随笔為你收集整理的Java线程的概念:什么是线程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.17 项目实例:模仿斗地主洗牌发牌小
- 下一篇: Java多线程的实现方式-Thread