Android多線程:必須了解的多線程基礎(chǔ)知識匯總


前言

  • 多線程的應(yīng)用在開發(fā)中非常常見
  • 今天喳张,我將獻(xiàn)上一份全面 & 詳細(xì)的多線程基礎(chǔ)知識匯總,希望你們喜歡美澳。

Carson帶你學(xué)多線程系列
基礎(chǔ)匯總
Android多線程:基礎(chǔ)知識匯總
基礎(chǔ)使用
Android多線程:繼承Thread類使用(含實例教程)
Android多線程:實現(xiàn)Runnable接口使用(含實例教程)
復(fù)合使用
Android 多線程:AsyncTask使用教程(含實例講解)
Android 多線程:AsyncTask原理及源碼分析
Android多線程:HandlerThread使用教程(含實例講解)
Android多線程:HandlerThread原理及源碼分析
Android多線程:IntentService使用教程(含實例講解)
Android多線程:IntentService的原理及源碼分析
Android多線程:線程池ThreadPool全方位教學(xué)
相關(guān)使用
Android異步通信:這是一份全面&詳細(xì)的Handler機(jī)制學(xué)習(xí)攻略
Android多線程:手把手教你全面學(xué)習(xí)神秘的Synchronized關(guān)鍵字
Android多線程:帶你了解神秘的線程變量 ThreadLocal


目錄

示意圖

1. 線程 - 介紹

1.1 定義

一個基本的CPU執(zhí)行單元 & 程序執(zhí)行流的最小單元销部。

1.2 特點

  • 比進(jìn)程更小的可獨立運行的基本單位,可理解為:輕量級進(jìn)程制跟;
  • 組成:線程ID + 程序計數(shù)器 + 寄存器集合 + 堆棧舅桩;
  • 線程自己不擁有系統(tǒng)資源,與其他線程共享進(jìn)程所擁有的全部資源雨膨。

1.3 作用

減少程序在并發(fā)執(zhí)行時所付出的時空開銷擂涛,提高操作系統(tǒng)的并發(fā)性能。

1.4 狀態(tài)說明

擁有類似于進(jìn)程的就緒哥放、阻塞歼指、運行3種基本狀態(tài),具體如下圖:

示意圖

2. 線程分類

線程主要分為:守護(hù)線程甥雕、非守護(hù)線程(用戶線程)

2.1 守護(hù)線程

守護(hù)用戶線程的線程踩身,即在程序運行時為其他線程提供一種通用服務(wù),如垃圾回收線程社露。設(shè)置該線程為守護(hù)線程的方式如下:

thread.setDaemon(true)挟阻;

2.2 非守護(hù)線程(用戶線程)

主要包括:主線程 & 子線程。

a. 主線程(UI線程)

  • 定義:Android系統(tǒng)在程序啟動時會自動啟動一條主線程
  • 作用:處理四大組件與用戶進(jìn)行交互的事情(如UI峭弟、界面交互相關(guān))
  • 注:因為用戶隨時會與界面發(fā)生交互附鸽,因此主線程任何時候都必須保持很高的響應(yīng)速度,所以主線程不允許進(jìn)行耗時操作瞒瘸,否則會出現(xiàn)ANR

b. 子線程(工作線程)

手動創(chuàng)建的線程坷备,主要用于耗時的操作(網(wǎng)絡(luò)請求、I/O操作等)

2.3 守護(hù)線程 與 非守護(hù)線程的區(qū)別

區(qū)別:虛擬機(jī)是否已退出:

  • 當(dāng)所有用戶線程結(jié)束時情臭,因為沒有守護(hù)的必要省撑,所以守護(hù)線程也會終止,虛擬機(jī)也同樣退出俯在;
  • 反過來竟秫,只要任何用戶線程還在運行,守護(hù)線程就不會終止跷乐,虛擬機(jī)就不會退出

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 設(shè)置

  • 通過方法setPriority(int grade)進(jìn)行優(yōu)先級設(shè)置
  • 默認(rèn)線程優(yōu)先級是5愕提,即 Thread.NORM_PRIORITY

4. 多線程 - 介紹

4.1 定義

多個線程同時進(jìn)行馒稍,即多個任務(wù)同時進(jìn)行

  1. 其實,計算機(jī)任何特定時刻只能執(zhí)行一個任務(wù)揪荣;
  2. 多線程只是一種錯覺:只是因為JVM快速調(diào)度資源來輪換線程筷黔,使得線程不斷輪流執(zhí)行,所以看起來好像在同時執(zhí)行多個任務(wù)而已

4.2 作用

Android官方聲明:在多線程編程時有兩大原則:

  1. 不要阻塞UI線程(即主線程):單線程會導(dǎo)致主線程阻塞仗颈,然后出現(xiàn)ANR錯誤:主線程被阻塞超過5s則會出現(xiàn)錯誤
  2. 不要在UI線程之外更新UI組件

所以佛舱,我們需要多線程(1個主線程+x個工作線程)來解決上述兩個問題:

  • 將耗時任務(wù)放在工作線程中進(jìn)行

對應(yīng)原則:不要阻塞UI線程(即主線程),即當(dāng)我們有耗時的任務(wù)挨决,如果在UI線程中執(zhí)行请祖,那就會阻塞UI線程了,必須要拋到工作線程中去執(zhí)行脖祈;

  • 將更新UI組件放在主線程中進(jìn)行

對應(yīng)原則:不要在UI線程之外訪問UI組件肆捕,即更新UI組件時眼虱,一定得在UI線程里執(zhí)行席纽,故需要在工作線程中執(zhí)行的任務(wù)結(jié)果返回到UI線程中去更新組件

4.3 應(yīng)用場景

  • 將耗時任務(wù)從主線程拋到工作線程中進(jìn)行
  • 將更新UI組件任務(wù)從工作線程拋到主線程中進(jìn)行

4.4 實現(xiàn)方式

Android多線程實現(xiàn)方式包括:


示意圖

5. 線程調(diào)度

5.1 調(diào)度方式

  • 當(dāng)系統(tǒng)存在大量線程時捏悬,系統(tǒng)會通過時間片輪轉(zhuǎn)的方式調(diào)度線程,因此線程不可能做到絕對的并發(fā)
  • 處于就緒狀態(tài)(Runnable)的線程都會進(jìn)入到線程隊列中等待CPU資源

同一時刻在線程隊列中可能有很多個

  • 在采用時間片的系統(tǒng)中润梯,每個線程都有機(jī)會獲得CPU的資源以便進(jìn)行自身的線程操作过牙;當(dāng)線程使用CPU資源的時間到后,即時線程沒有完成自己的全部操作纺铭,JVM也會中斷當(dāng)前線程的執(zhí)行寇钉,把CPU資源的使用權(quán)切換給下一個隊列中等待的線程扫倡。

被中斷的線程將等待CPU資源的下一次輪回,然后從中斷處繼續(xù)執(zhí)行

5.2 調(diào)度優(yōu)先級

Java虛擬機(jī)(JVM)中的線程調(diào)度器負(fù)責(zé)管理線程竟纳,并根據(jù)以下規(guī)則進(jìn)行調(diào)度:

  1. 根據(jù)線程優(yōu)先級(高-低)镊辕,將CPU資源分配給各線程
  2. 具備相同優(yōu)先級的線程以輪流的方式獲取CPU資源

這里需要特別注意的是:優(yōu)先級高的,只是獲得資源的機(jī)會高一些揩悄,并非完全獨占CPU運行卖哎;優(yōu)先級低的也并非要等高優(yōu)先級的線程運行完才能輪到,是相對來說獲得資源的機(jī)率低一些删性,僅此而已亏娜。


6. 線程同步

  • 定義:當(dāng)線程A使用同步方法A時,其他線程必須等到線程A使用完同步方法A后才能使用
  • 同步方法用關(guān)鍵字 Synchronized 進(jìn)行修飾
public synchronized void Sb_Android(){
        }

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. 進(jìn)程 - 介紹

8.1 定義

是進(jìn)程實體的運行過程 & 系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨立單位

8.2 作用

使多個程序可 并發(fā)執(zhí)行,以提高系統(tǒng)的資源利用率和吞吐量

8.3 進(jìn)程狀態(tài)說明(前三個為基礎(chǔ)狀態(tài))

示意圖

注意 就緒榕茧、阻塞狀態(tài)的區(qū)別:

  1. 就緒狀態(tài):進(jìn)程缺少的資源 = 處理機(jī)垃沦,只要獲得處理機(jī)資源立即執(zhí)行
  2. 等待狀態(tài):指 進(jìn)程缺少其他資源(除了處理機(jī)) / 等待某一事件

8.4 狀態(tài)轉(zhuǎn)換

示意圖

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

示意圖

10. 單/多進(jìn)程、單/多線程的區(qū)別

假設(shè):進(jìn)程 = 桌子用押,單線程 = 1個人吃飯

  • 單進(jìn)程肢簿、單線程:一個人在一個桌子上吃飯
  • 單進(jìn)程、多線程:多個人在同一個桌子上一起吃飯
  • 多進(jìn)程、單線程:多個人每個人在自己的桌子上吃飯

11. 總結(jié)

  • 本文主要全面介紹了多線程中的基礎(chǔ)知識
  • 下一篇文章我將對講解Android多線程的相關(guān)知識池充,感興趣的同學(xué)可以繼續(xù)關(guān)注Carson_Ho的簡書

Carson帶你學(xué)多線程系列
基礎(chǔ)匯總
Android多線程:基礎(chǔ)知識匯總
基礎(chǔ)使用
Android多線程:繼承Thread類使用(含實例教程)
Android多線程:實現(xiàn)Runnable接口使用(含實例教程)
復(fù)合使用
Android 多線程:AsyncTask使用教程(含實例講解)
Android 多線程:AsyncTask原理及源碼分析
Android多線程:HandlerThread使用教程(含實例講解)
Android多線程:HandlerThread原理及源碼分析
Android多線程:IntentService使用教程(含實例講解)
Android多線程:IntentService的原理及源碼分析
Android多線程:線程池ThreadPool全方位教學(xué)
相關(guān)使用
Android異步通信:這是一份全面&詳細(xì)的Handler機(jī)制學(xué)習(xí)攻略
Android多線程:手把手教你全面學(xué)習(xí)神秘的Synchronized關(guān)鍵字
Android多線程:帶你了解神秘的線程變量 ThreadLocal


歡迎關(guān)注Carson_Ho的簡書

不定期分享關(guān)于安卓開發(fā)的干貨桩引,追求短、平收夸、快阐污,但卻不缺深度


請點贊咱圆!因為你的鼓勵是我寫作的最大動力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末功氨,一起剝皮案震驚了整個濱河市序苏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捷凄,老刑警劉巖忱详,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跺涤,居然都是意外死亡匈睁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門桶错,熙熙樓的掌柜王于貴愁眉苦臉地迎上來航唆,“玉大人,你說我怎么就攤上這事院刁∨锤疲” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵退腥,是天一觀的道長任岸。 經(jīng)常有香客問我,道長狡刘,這世上最難降的妖魔是什么享潜? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮嗅蔬,結(jié)果婚禮上剑按,老公的妹妹穿的比我還像新娘。我一直安慰自己澜术,他們只是感情好吕座,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘪板,像睡著了一般吴趴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天锣枝,我揣著相機(jī)與錄音厢拭,去河邊找鬼。 笑死撇叁,一個胖子當(dāng)著我的面吹牛供鸠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陨闹,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼楞捂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趋厉?” 一聲冷哼從身側(cè)響起寨闹,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎君账,沒想到半個月后繁堡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡乡数,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年椭蹄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片净赴。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡绳矩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玖翅,到底是詐尸還是另有隱情埋酬,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布烧栋,位于F島的核電站写妥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏审姓。R本人自食惡果不足惜珍特,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魔吐。 院中可真熱鬧扎筒,春花似錦、人聲如沸酬姆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辞色。三九已至骨宠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背层亿。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工桦卒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匿又。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓方灾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碌更。 傳聞我的和親對象是個殘疾皇子裕偿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容