在開發(fā)中只要涉及到性能調(diào)優(yōu),多線程是避不開的話題,之前也一直在用,不過沒有系統(tǒng)的整理一遍,這段時間利用快過年了也不是很忙,整理了一下多線程的知識,從網(wǎng)上找的視頻看了一遍,就當是記錄一下了。
概念
進程:系統(tǒng)中正在運行的一個應(yīng)用程序,進程中只有有一個線程
線程:一個進程要執(zhí)行任務(wù),必須有線程,進程的所有任務(wù)都是在線程中進行的
線程的串行:一個線程中的任務(wù)執(zhí)行都是串行的,在一個線程中執(zhí)行多個任務(wù),只能一個一個的按順序執(zhí)行,并且同一時間,一個線程只能執(zhí)行一個任務(wù)
多線程:一個進程可以開啟多個線程,每個線程可以并行(同時)執(zhí)行不同的任務(wù),多線程可以提高程序的執(zhí)行效率
多線程原理:同一時間CPU只能處理1個線程,只有一個線程在工作(執(zhí)行),多線程并發(fā)執(zhí)行,其實是CPU快速的在多條線程之間調(diào)度(切換),這樣CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象
多線程的優(yōu)點:能適度的提高程序的執(zhí)行效率,能適度的提高資源的利用率(CPU、內(nèi)存利用率)
多線程的缺點:創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)、??臻g、創(chuàng)建時間。所以如果開啟大量線程,會降低程序性能,線程越多,CPU在調(diào)度線程上的開銷就越大,還會增加程序設(shè)計的復(fù)雜性,要合理的開啟線程。
多線程在iOS開發(fā)中的應(yīng)用
主線程:iOS程序在運行后,會默認開啟一條線程,稱為“主線程”或“UI線程”,主線程的主要作用是:顯示/刷新UI界面,處理事件(點擊事件、滑動事件、拖拽事件等),界面UI的處理都需要在主線程中進行,否則會沒有效果。但是比較耗時的操作不要放到主線程中,否則會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的體驗。
多線程的實現(xiàn)方案
| 技術(shù)方案 | 簡介 | 語言 | 線程生命周期 | 使用頻率 |
|---|---|---|---|---|
| NSThread | 面向?qū)ο螅唵我子?,可直接操作線程對象 | OC | 程序員管理 | 偶爾使用 |
| GCD | 蘋果替代NSThread的線程技術(shù),充分利用設(shè)備的多核 | C | 自動管理 | 經(jīng)常使用 |
| NSOperation | 基于GCD,比GCD多了一些簡單實用的功能,更加的面向?qū)ο?/td> | OC | 自動管理 | 經(jīng)常使用 |
@synchronized(self)的用法:
@synchronized
@synchronized 的作用是創(chuàng)建一個互斥鎖,保證此時沒有其它線程對self對象進行修改。這個是objective-c的一個鎖定令牌,防止self對象在同一時間內(nèi)被其它線程訪問,起到線程的保護作用。
// 鎖定一段代碼,必須使用一把鎖對象,用多把鎖對象是無效的
@synchronized (self) {// self是鎖對象
// 需要鎖定的代碼
while (1) {
NSInteger count = self.ticketCount;
if (count > 0) {
self.ticketCount = count - 1;
NSLog(@"%@賣了一張,還剩下%zd張",[NSThread currentThread].name,self.ticketCount);
} else {
NSLog(@"全部賣完了");
break;
}
}
}
/*
* 優(yōu)點:能防止多線程爭奪資源時造成的數(shù)據(jù)安全問題
* 缺點:需要消耗大量CPU資源
*/