前言
線程是用來執(zhí)行任務(wù)的,線程徹底執(zhí)行完任務(wù)A才能去執(zhí)行任務(wù)B膜楷。為了同時執(zhí)行兩個任務(wù)旭咽,產(chǎn)生了多線程。
1赌厅、什么是進程穷绵?
進程就是在操作系統(tǒng)中運行的程序
進程不能執(zhí)行任務(wù)
進程在運行時創(chuàng)建的資源隨著進程的終止而死亡
2、線程
(1)進程本身不能執(zhí)行任務(wù)的特愿,進程想要執(zhí)行任務(wù)仲墨,必須要有線程,線程是進程內(nèi)部一個獨立的執(zhí)行單元揍障,同時只能執(zhí)行一個任務(wù)目养。線程被分為兩種,主線程和子線程
(2)線程執(zhí)行完畢就會被銷毀
(3)主線程:當(dāng)應(yīng)用程序啟動時自動創(chuàng)建和啟動毒嫡,通常用來處理用戶的輸入并響應(yīng)各種事件和消息癌蚁,主線程的終止也意味著該程序的結(jié)束。
(4)子線程:由主線程來創(chuàng)建兜畸,用來幫助主線程執(zhí)行程序的后臺處理任務(wù)努释,如果子線程A中有創(chuàng)建了一個子線程B,在創(chuàng)建之后咬摇,這兩者就會是相互獨立的伐蒂,多個子線程之間效果上可以同時執(zhí)行
(5)一個進程中可以有多個線程,并且所有線程都在該進程的虛擬地址空間中肛鹏,可以使用進程的全局變量和系統(tǒng)資源
3逸邦、關(guān)于多線程
(1)目前大多數(shù)的app,都需要連接服務(wù)器,而訪問服務(wù)器的速度可能快也可能很慢在扰。如果一個app訪問服務(wù)器的操作沒有在子線程操作的話缕减,在該app訪問服務(wù)器的過程中,該軟件是不能響應(yīng)用戶的操作的健田,只有該app訪問結(jié)束以后烛卧,app才能響應(yīng)用戶的操作,這就造成線程阻塞,也就是我們常見的卡頓現(xiàn)象总放。一條線程在同一時間內(nèi)只能執(zhí)行一個任務(wù),但是進程可以有多條線程呈宇。可以開啟多條線程來執(zhí)行不同的任務(wù),從而提高程序的執(zhí)行效率局雄,避免線程阻塞甥啄。
(2)操作系統(tǒng)會根據(jù)線程的優(yōu)先級(線程的優(yōu)先級可以手動設(shè)置)來安排CPU的時間,優(yōu)先級高的線程炬搭,優(yōu)先調(diào)用的幾率會更大蜈漓,同級的話,看線程執(zhí)行的先后宫盔。
(3)同一時間內(nèi)融虽,CPU只能處理一條線程,只有一條線程在工作灼芭。多線程并行執(zhí)行有额,其實就是各個線程不斷切換,因為執(zhí)行切換的時間很快很快彼绷,就造成了同時執(zhí)行的假象巍佑,原理如下,比如A寄悯,B兩個線程萤衰;
A執(zhí)行到某一時間段要切換了,可A任務(wù)沒完成猜旬,系統(tǒng)就會把A當(dāng)前執(zhí)行的位置和數(shù)據(jù)以入棧的方式保存起來
然后B線程執(zhí)行脆栋,B執(zhí)行時間到了,它的位置狀態(tài)等也會被系統(tǒng)保存到B的棧中洒擦。
(4)系統(tǒng)自動找到A的棧筹吐,將A之前保存的數(shù)據(jù)恢復(fù),又可以從A之前斷開的狀態(tài)繼續(xù)執(zhí)行下去秘遏,如此循環(huán),系統(tǒng)每開一個線程都有比較大的開銷嘉竟。若線程開的過多邦危,不僅會占用大量內(nèi)存和讓程序變得更加復(fù)雜,而且會加重CPU的負(fù)擔(dān)舍扰,這樣的軟件倦蚪,會使你的手機在冬天變成暖手寶。
4边苹、多線程的優(yōu)點和不足
優(yōu)點:(1)提高程序執(zhí)行效率陵且,避免線程阻塞造成的卡頓現(xiàn)象。
? ? ? ? ? (2)能適當(dāng)提高資源利用率(CPU,內(nèi)存)。
不可濫用多線程:
開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下慕购,主線程占用1M聊疲,子線程占用512KB,可以自己設(shè)置內(nèi)存大小沪悲,但必須是4的倍數(shù))获洲,如果開啟大量的線程,會占用大量的內(nèi)存空間殿如,降低程序的性能
線程越多贡珊,CPU在調(diào)度線程上的開銷就越大,程序設(shè)計更加復(fù)雜:比如線程之間的通信涉馁、多線程的數(shù)據(jù)共享
5门岔、線程與進程的關(guān)系
(1)線程是CPU執(zhí)行任務(wù)的基本單位,一個進程可以有多個線程烤送,但同時只能執(zhí)行一個任務(wù)寒随。
(2)進程就是運行中的軟件,是動態(tài)的胯努。
(3)一個操作系統(tǒng)可以對應(yīng)多個進程,一個進程可以有多條線程,但至少有一個線程
(4)同一個進程內(nèi)的線程共享進程里的資源