JAVA 多執行緒基礎
引言
現代作業系統(Windows,macOS,Linux)都可以執行多工,多工就是同時執行多個任務。
CPU執行程式碼都是一條一條順序執行的,但是,即使是單核cpu,也可以同時執行多個任務。因為作業系統執行多工實際上就是讓CPU對多個任務輪流交替執行。例如,假設我們有語文、數學、英語3門作業要做,每個作業需要30分鐘。我們把這3門作業看成是3個任務,可以做1分鐘語文作業,再做1分鐘數學作業,再做1分鐘英語作業:這樣輪流做下去,在某些人眼裡看來,做作業的速度就非常快,看上去就像同時在做3門作業一樣,類似的,作業系統輪流讓多個任務交替執行,例如,讓瀏覽器執行0.001秒,讓QQ執行0.001秒,再讓音樂播放器執行0.001秒,在人看來,CPU就是在同時執行多個任務。即使是多核CPU,因為通常任務的數量遠遠多於CPU的核數,所以任務也是交替執行的。
程序
在計算機中,我們把一個任務稱為一個程序,瀏覽器就是一個程序,視訊播放器是另一個程序,類似的,音樂播放器和Word都是程序。某些程序內部還需要同時執行多個子任務。例如,我們在使用Word時,Word可以讓我們一邊打字,一邊進行拼寫檢查,同時還可以在後臺進行列印,我們把子任務稱為執行緒。程序和執行緒的關係就是:一個程序可以包含一個或多個執行緒,但至少會有一個執行緒。
作業系統排程的最小任務單位其實不是程序,而是執行緒。常用的Windows、Linux等作業系統都採用搶佔式多工,如何排程執行緒完全由作業系統決定,程式自己不能決定什麼時候執行,以及執行多長時間。因為同一個應用程式,既可以有多個程序,也可以有多個執行緒,因此,實現多工的方法,有以下幾種:
多程序模式(每個程序只有一個執行緒):
多執行緒模式(一個程序有多個執行緒):
多程序+多執行緒模式(複雜度最高):
程序 vs 執行緒
程序和執行緒是包含關係,但是多工既可以由多程序實現,也可以由單程序內的多執行緒實現,還可以混合多程序+多執行緒。
具體採用哪種方式,要考慮到程序和執行緒的特點。
和多執行緒相比,多程序的缺點在於:
- 建立程序比建立執行緒開銷大,尤其是在Windows系統上;
- 程序間通訊比執行緒間通訊要慢,因為執行緒間通訊就是讀寫同一個變數,速度很快。
而多程序的優點在於:
多程序穩定性比多執行緒高,因為在多程序的情況下,一個程序崩潰不會影響其他程序,而在多執行緒的情況下,任何一個執行緒崩潰會直接導致整個程序崩潰。
多執行緒
Java語言內建了多執行緒支援:一個Java程式實際上是一個JVM程序,JVM程序用一個主執行緒來執行main()
方法,在main()
方法內部,我們又可以啟動多個執行緒。此外,JVM還有負責垃圾回收的其他工作執行緒等。
因此,對於大多數Java程式來說,我們說多工,實際上是說如何使用多執行緒實現多工。
和單執行緒相比,多執行緒程式設計的特點在於:多執行緒經常需要讀寫共享資料,並且需要同步。例如,播放電影時,就必須由一個執行緒播放視訊,另一個執行緒播放音訊,兩個執行緒需要協調執行,否則畫面和聲音就不同步。因此,多執行緒程式設計的複雜度高,除錯更困難。
Java多執行緒程式設計的特點又在於:
- 多執行緒模型是Java程式最基本的併發模型;
- 後續讀寫網路、資料庫、Web開發等都依賴Java多執行緒模型。
因此,必須掌握Java多執行緒程式設計才能繼續深入學習其他內容。