
前言
- 多線程的應用在開發(fā)中非常常見
- 今天,我將獻上一份全面 & 詳細的多線程基礎知識匯總,希望你們喜歡。
Carson帶你學多線程系列
基礎匯總
Android多線程:基礎知識匯總
基礎使用
Android多線程:繼承Thread類使用(含實例教程)
Android多線程:實現(xiàn)Runnable接口使用(含實例教程)
復合使用
Android 多線程:AsyncTask使用教程(含實例講解)
Android 多線程:AsyncTask原理及源碼分析
Android多線程:HandlerThread使用教程(含實例講解)
Android多線程:HandlerThread原理及源碼分析
Android多線程:IntentService使用教程(含實例講解)
Android多線程:IntentService的原理及源碼分析
Android多線程:線程池ThreadPool全方位教學
相關(guān)使用
Android異步通信:這是一份全面&詳細的Handler機制學習攻略
Android多線程:手把手教你全面學習神秘的Synchronized關(guān)鍵字
Android多線程:帶你了解神秘的線程變量 ThreadLocal
目錄

1. 線程 - 介紹
1.1 定義
一個基本的CPU執(zhí)行單元 & 程序執(zhí)行流的最小單元。
1.2 特點
- 比進程更小的可獨立運行的基本單位,可理解為:輕量級進程;
- 組成:線程ID + 程序計數(shù)器 + 寄存器集合 + 堆棧;
- 線程自己不擁有系統(tǒng)資源,與其他線程共享進程所擁有的全部資源。
1.3 作用
減少程序在并發(fā)執(zhí)行時所付出的時空開銷,提高操作系統(tǒng)的并發(fā)性能。
1.4 狀態(tài)說明
擁有類似于進程的就緒、阻塞、運行3種基本狀態(tài),具體如下圖:

2. 線程分類
線程主要分為:守護線程、非守護線程(用戶線程)
2.1 守護線程
守護用戶線程的線程,即在程序運行時為其他線程提供一種通用服務,如垃圾回收線程。設置該線程為守護線程的方式如下:
thread.setDaemon(true);
2.2 非守護線程(用戶線程)
主要包括:主線程 & 子線程。
a. 主線程(UI線程)
- 定義:Android系統(tǒng)在程序啟動時會自動啟動一條主線程
- 作用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關(guān))
- 注:因為用戶隨時會與界面發(fā)生交互,因此主線程任何時候都必須保持很高的響應速度,所以主線程不允許進行耗時操作,否則會出現(xiàn)ANR
b. 子線程(工作線程)
手動創(chuàng)建的線程,主要用于耗時的操作(網(wǎng)絡請求、I/O操作等)
2.3 守護線程 與 非守護線程的區(qū)別
區(qū)別:虛擬機是否已退出:
- 當所有用戶線程結(jié)束時,因為沒有守護的必要,所以守護線程也會終止,虛擬機也同樣退出;
- 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出
3. 線程優(yōu)先級
3.1 表示
線程優(yōu)先級分為10個級別,分別用Thread類常量表示。
public static final int MIN_PRIORITY = 1; // 優(yōu)先級1
public static final int NORM_PRIORITY = 5; // 優(yōu)先級5
public static final int MAX_PRIORITY = 10; // 優(yōu)先級10
3.2 設置
- 通過方法
setPriority(int grade)進行優(yōu)先級設置 - 默認線程優(yōu)先級是5,即
Thread.NORM_PRIORITY
4. 多線程 - 介紹
4.1 定義
多個線程同時進行,即多個任務同時進行
- 其實,計算機任何特定時刻只能執(zhí)行一個任務;
- 多線程只是一種錯覺:只是因為JVM快速調(diào)度資源來輪換線程,使得線程不斷輪流執(zhí)行,所以看起來好像在同時執(zhí)行多個任務而已
4.2 作用
Android官方聲明:在多線程編程時有兩大原則:
- 不要阻塞UI線程(即主線程):單線程會導致主線程阻塞,然后出現(xiàn)ANR錯誤:主線程被阻塞超過5s則會出現(xiàn)錯誤
- 不要在UI線程之外更新UI組件
所以,我們需要多線程(1個主線程+x個工作線程)來解決上述兩個問題:
- 將耗時任務放在工作線程中進行
對應原則:不要阻塞UI線程(即主線程),即當我們有耗時的任務,如果在UI線程中執(zhí)行,那就會阻塞UI線程了,必須要拋到工作線程中去執(zhí)行;
- 將更新UI組件放在主線程中進行
對應原則:不要在UI線程之外訪問UI組件,即更新UI組件時,一定得在UI線程里執(zhí)行,故需要在工作線程中執(zhí)行的任務結(jié)果返回到UI線程中去更新組件
4.3 應用場景
- 將耗時任務從主線程拋到工作線程中進行
- 將更新UI組件任務從工作線程拋到主線程中進行
4.4 實現(xiàn)方式
Android多線程實現(xiàn)方式包括:

5. 線程調(diào)度
5.1 調(diào)度方式
- 當系統(tǒng)存在大量線程時,系統(tǒng)會通過時間片輪轉(zhuǎn)的方式調(diào)度線程,因此線程不可能做到絕對的并發(fā)
- 處于就緒狀態(tài)(Runnable)的線程都會進入到線程隊列中等待CPU資源
同一時刻在線程隊列中可能有很多個
- 在采用時間片的系統(tǒng)中,每個線程都有機會獲得CPU的資源以便進行自身的線程操作;當線程使用CPU資源的時間到后,即時線程沒有完成自己的全部操作,JVM也會中斷當前線程的執(zhí)行,把CPU資源的使用權(quán)切換給下一個隊列中等待的線程。
被中斷的線程將等待CPU資源的下一次輪回,然后從中斷處繼續(xù)執(zhí)行
5.2 調(diào)度優(yōu)先級
Java虛擬機(JVM)中的線程調(diào)度器負責管理線程,并根據(jù)以下規(guī)則進行調(diào)度:
- 根據(jù)線程優(yōu)先級(高-低),將CPU資源分配給各線程
- 具備相同優(yōu)先級的線程以輪流的方式獲取CPU資源
這里需要特別注意的是:優(yōu)先級高的,只是獲得資源的機會高一些,并非完全獨占CPU運行;優(yōu)先級低的也并非要等高優(yōu)先級的線程運行完才能輪到,是相對來說獲得資源的機率低一些,僅此而已。
6. 線程同步
- 定義:當線程A使用同步方法A時,其他線程必須等到線程A使用完同步方法A后才能使用
- 同步方法用關(guān)鍵字
Synchronized進行修飾
public synchronized void Sb_Android(){
}
- 關(guān)于關(guān)鍵字Synchronized的介紹請看文章:Java:手把手教你全面學習神秘的Synchronized關(guān)鍵字
7. 線程聯(lián)合
- 定義:線程A在占有CPU資源期間,通過調(diào)用join()方法中斷自身線程執(zhí)行,然后運行聯(lián)合它的線程B,直到線程B執(zhí)行完畢后線程A再重新排隊等待CPU資源,這個過程稱為線程A聯(lián)合線程B
- 線程A聯(lián)合線程B,即在線程A的執(zhí)行操作里定義:
B.join();
8. 進程 - 介紹
8.1 定義
是進程實體的運行過程 & 系統(tǒng)進行資源分配和調(diào)度的一個獨立單位
8.2 作用
使多個程序可 并發(fā)執(zhí)行,以提高系統(tǒng)的資源利用率和吞吐量
8.3 進程狀態(tài)說明(前三個為基礎狀態(tài))

注意 就緒、阻塞狀態(tài)的區(qū)別:
- 就緒狀態(tài):進程缺少的資源 = 處理機,只要獲得處理機資源立即執(zhí)行
- 等待狀態(tài):指 進程缺少其他資源(除了處理機) / 等待某一事件
8.4 狀態(tài)轉(zhuǎn)換

9. 線程與進程的區(qū)別

10. 單/多進程、單/多線程的區(qū)別
假設:進程 = 桌子,單線程 = 1個人吃飯
- 單進程、單線程:一個人在一個桌子上吃飯
- 單進程、多線程:多個人在同一個桌子上一起吃飯
- 多進程、單線程:多個人每個人在自己的桌子上吃飯
11. 總結(jié)
- 本文主要全面介紹了多線程中的基礎知識
- 下一篇文章我將對講解
Android多線程的相關(guān)知識,感興趣的同學可以繼續(xù)關(guān)注Carson_Ho的簡書
Carson帶你學多線程系列
基礎匯總
Android多線程:基礎知識匯總
基礎使用
Android多線程:繼承Thread類使用(含實例教程)
Android多線程:實現(xiàn)Runnable接口使用(含實例教程)
復合使用
Android 多線程:AsyncTask使用教程(含實例講解)
Android 多線程:AsyncTask原理及源碼分析
Android多線程:HandlerThread使用教程(含實例講解)
Android多線程:HandlerThread原理及源碼分析
Android多線程:IntentService使用教程(含實例講解)
Android多線程:IntentService的原理及源碼分析
Android多線程:線程池ThreadPool全方位教學
相關(guān)使用
Android異步通信:這是一份全面&詳細的Handler機制學習攻略
Android多線程:手把手教你全面學習神秘的Synchronized關(guān)鍵字
Android多線程:帶你了解神秘的線程變量 ThreadLocal
歡迎關(guān)注Carson_Ho的簡書
不定期分享關(guān)于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度。
