多線程
首先了解多線程
應(yīng)用程序(Application):為了完成特定任務(wù)项鬼,用某種語言編寫的一組指令集合(一組靜態(tài)代碼)
-
進(jìn)程:進(jìn)程指正在運(yùn)行的程序
- 系統(tǒng)調(diào)度與資源分配的一個(gè)獨(dú)立單位
- 當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行谆趾,即變成一個(gè)進(jìn)程
- 進(jìn)程是處于運(yùn)行過程中的程序纱耻,并且具有一定獨(dú)立功能
-
線程:線程是進(jìn)程中的一個(gè)執(zhí)行單元娘香,負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行
- 一個(gè)進(jìn)程中至少有一個(gè)線程
- 一個(gè)進(jìn)程中是可以有多個(gè)線程的杈笔,這個(gè)應(yīng)用程序也可以稱之為多線程程序
簡(jiǎn)而言之:一個(gè)程序運(yùn)行后至少有一個(gè)進(jìn)程道川,一個(gè)進(jìn)程中可以包含多個(gè)線程
線程是由程序負(fù)責(zé)管理的
而進(jìn)程則是由系統(tǒng)進(jìn)行調(diào)度的
線程的生命周期
- 新建 :從新建一個(gè)線程對(duì)象到程序start() 這個(gè)線程之間的狀態(tài)蒋腮,都是新建狀態(tài)逗旁;
- 就緒 :線程對(duì)象調(diào)用start()方法后朵你,就處于就緒狀態(tài)例诀,等到JVM里的線程調(diào)度器的調(diào)度荔泳;
- 運(yùn)行 :就緒狀態(tài)下的線程在獲取CPU資源后就可以執(zhí)行run(),此時(shí)的線程便處于運(yùn)行狀態(tài)激况,運(yùn)行狀態(tài)的線程可變?yōu)榫途w、阻塞及死亡三種狀態(tài)淀衣。
- 等待/阻塞/睡眠 :在一個(gè)線程執(zhí)行了sleep(睡眠)昙读、suspend(掛起)等方法后會(huì)失去所占有的資源,從而進(jìn)入阻塞狀態(tài)膨桥,在睡眠結(jié)束后可重新進(jìn)入就緒狀態(tài)蛮浑。
- 終止 :run()方法完成后或發(fā)生其他終止條件時(shí)就會(huì)切換到終止?fàn)顟B(tài)。
線程創(chuàng)建的一般方法
實(shí)現(xiàn)步驟 | 優(yōu)勢(shì) | 劣勢(shì) | |
---|---|---|---|
繼承Thread類 | ①只嚣、定義類繼承Thread ②沮稚、復(fù)寫Thread類中的run方法(目的:將自定義代碼存儲(chǔ)在run方法,讓線程運(yùn)行) ③册舞、調(diào)用線程的start方法:該方法有兩步:?jiǎn)?dòng)線程壮虫,調(diào)用run方法。 |
編寫簡(jiǎn)單环础,可直接用this.getname()獲取當(dāng)前線程,不必使用Thread.currentThread()方法 | 已經(jīng)繼承了Thread類剩拢,無法再繼承其他類 |
繼承Thread類 | ①线得、定義類實(shí)現(xiàn)Runnable接口 ②、覆蓋Runnable接口中的run方法(將線程要運(yùn)行的代碼放在該run方法中) ③徐伐、通過Thread類建立線程對(duì)象 ④贯钩、將Runnable接口的子類對(duì)象作為實(shí)際參數(shù)傳遞給Thread類的構(gòu)造函數(shù)(線程執(zhí)行指定Runnable對(duì)象的run方法) ⑤、調(diào)用Thread類的start方法開啟線程并調(diào)用Runnable接口子類的run方法 |
避免了單繼承的局限性、多個(gè)線程可以共享一個(gè)target對(duì)象角雷,非常適合多線程處理同一份資源的情形 | 比較復(fù)雜祸穷、訪問線程必須使用Thread.currentThread()方法、無返回值 |
通過Callable和Future創(chuàng)建線程 | ①勺三、創(chuàng)建Callable接口的實(shí)現(xiàn)類雷滚,并實(shí)現(xiàn)call()方法,改方法將作為線程執(zhí)行體吗坚,且具有返回值 ②祈远、創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例,使用FutrueTask類進(jìn)行包裝Callable對(duì)象商源,F(xiàn)utureTask對(duì)象封裝了Callable對(duì)象的call()方法的返回值 ③车份、使用FutureTask對(duì)象作為Thread對(duì)象啟動(dòng)新線程 ④、調(diào)用FutureTask對(duì)象的get()方法獲取子線程執(zhí)行結(jié)束后的返回值 |
有返回值牡彻、避免了單繼承的局限性扫沼、多個(gè)線程可以共享一個(gè)target對(duì)象,非常適合多線程處理同一份資源的情形 | 比較復(fù)雜庄吼、訪問線程必須使用Thread.currentThread()方法 |
調(diào)用start()方法將會(huì)創(chuàng)建一個(gè)執(zhí)行run()方法的線程
不管何種情況下缎除,要想啟動(dòng)多線程霸褒,一定依靠Thread類完成
多線程應(yīng)用在Android開發(fā)
- 繼承Thread類
- 實(shí)現(xiàn)Runnable接口
- Handler
- AsyncTask
- HandlerThread
- IntentService
進(jìn)程和線程的區(qū)別
根本區(qū)別
進(jìn)程是操作系統(tǒng)資源分配的基本單位
線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位
進(jìn)程 | 線程 | |
---|---|---|
資源開銷 | 每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開銷 | 線程可以看做輕量級(jí)的進(jìn)程废菱,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC)殊轴,線程之間切換的開銷小 |
包含關(guān)系 | 如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程衰倦,則執(zhí)行過程不是一條線的,而是多條線(線程)共同完成的 | 線程是進(jìn)程的一部分旁理,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程 |
內(nèi)存分配 | 進(jìn)程之間的地址空間和資源是相互獨(dú)立的 | 同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源 |
影響關(guān)系 | 一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響 | 一個(gè)線程崩潰整個(gè)進(jìn)程都死掉 |
執(zhí)行過程 | 每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口驻襟、順序執(zhí)行序列和程序出口 | 線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中芋哭,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制 |
多進(jìn)程要比多線程健壯
兩者均可并發(fā)執(zhí)行
AsyncTask和Handler的區(qū)別
數(shù)據(jù)簡(jiǎn)單使用AsyncTask沉衣,實(shí)現(xiàn)代碼簡(jiǎn)單,數(shù)據(jù)量多且復(fù)雜使用handler+thread
相比較AsyncTask來說能更好的利用系統(tǒng)資源且高效减牺,但有些復(fù)雜邏輯比較難完成
AsyncTask實(shí)現(xiàn)的原理和適用的優(yōu)缺點(diǎn)
AsyncTask存谎,是android提供的輕量級(jí)的異步類肥隆,可以直接繼承AsyncTask,在類中實(shí)現(xiàn)異步操作栋艳,并提供接口反饋當(dāng)前異步執(zhí)行的程度(可以通過接口實(shí)現(xiàn)UI進(jìn)度更新),最后反饋執(zhí)行的結(jié)果給UI主線程
-
使用的優(yōu)點(diǎn):
簡(jiǎn)單,快捷
過程可控
使用的缺點(diǎn):
在使用多個(gè)異步操作和并需要進(jìn)行Ui變更時(shí),就變得復(fù)雜起來.
Handler異步實(shí)現(xiàn)的原理和適用的優(yōu)缺點(diǎn)
在Handler 異步實(shí)現(xiàn)時(shí)憨琳,涉及到 Handler, Looper, Message,Thread四個(gè)對(duì)象,實(shí)現(xiàn)異步的流程是主線程啟動(dòng)Thread(子線程)運(yùn)行并生成Message-Looper獲取Message并傳遞給HandlerHandler逐個(gè)獲取Looper中的Message篙螟,并進(jìn)行UI變更
-
使用的優(yōu)點(diǎn):
結(jié)構(gòu)清晰问拘,功能定義明確
對(duì)于多個(gè)后臺(tái)任務(wù)時(shí),簡(jiǎn)單骤坐,清晰
使用的缺點(diǎn):
在單個(gè)后臺(tái)異步處理時(shí),顯得代碼過多蕾久,結(jié)構(gòu)過于復(fù)雜(相對(duì)性)