A.進程
什么是進程
進程是指在系統(tǒng)中正在運行的一個應用程序
每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi)
比如同時打開
QQ、Xcode,系統(tǒng)就會分別啟動2個進程
通過“活動監(jiān)視器”可以查看Mac系統(tǒng)中所開啟的進程
B.線程
主線程、子線程占用內(nèi)存分別是1M和512K
1.什么是線程
1個進程要想執(zhí)行任務,必須得有線程(每1個進程至少要有1條線程)
線程是進程的基本執(zhí)行單元,一個進程(程序)的所有任務都在線程中執(zhí)行
比如使用酷狗播放音樂、使用
迅雷下載電影,都需要在線程中執(zhí)行
2.線程的串行
1個線程中任務的執(zhí)行是串行的
如果要在1個線程中執(zhí)行多個任務,那么只能一個一個地按順序執(zhí)行這些任務
也就是說,在同一時間內(nèi),1個線程只能執(zhí)行1個任務
比如在1個線程中下載3個文件(分別是文件A、文件B、文件C)
3.多線程
什么是多線程
1個進程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務
進程 車間,線程 車間工人
多線程技術(shù)可以提高程序的執(zhí)行效率
比如同時開啟3條線程分別下載3個文件(分別是文件A、文件B、文件C)
4.多線程原理
多線程的原理
同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)
多線程并發(fā)(同時)執(zhí)行,其實是CPU快速地在多條線程之間調(diào)度(切換)
如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象
思考:如果線程非常非常多,會發(fā)生什么情況?
CPU會在N多線程之間調(diào)度,CPU會累死,消耗大量的CPU資源
每條線程被調(diào)度執(zhí)行的頻次會降低(線程的執(zhí)行效率降低)
5.多線程的優(yōu)缺點
多線程的優(yōu)點
能適當提高程序的執(zhí)行效率
能適當提高資源利用率(CPU、內(nèi)存利用率)
多線程的缺點
開啟線程需要占用一定的內(nèi)存空間(默認情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會占用大量的內(nèi)存空間,降低程序的性能
線程越多,CPU在調(diào)度線程上的開銷就越大
程序設計更加復雜:比如線程之間的通信、多線程的數(shù)據(jù)共享
6.主線程
什么是主線程
一個iOS程序運行后,默認會開啟1條線程,稱為“主線程”或“UI線程”
主線程的主要作用
顯示/刷新UI界面
處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
主線程的使用注意
別將比較耗時的操作放到主線程中
耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗
7.iOS多線程實現(xiàn)技術(shù)
- pthread
- NSThread
- GCD
- NSOperation
C.需要掌握的
多線程
1.NSThread
1> 開線程的幾種方式
* 先創(chuàng)建,后啟動
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
* 直接啟動
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
[self performSelectorInBackground:@selector(run) withObject:nil];
2> 其他用法
NSThread *current = [NSThread currentThread];
+ (NSThread *)mainThread; // 獲得主線程
3> 線程間通信
performSelectorOnMainThread.....
2.GCD(重點)
1> 隊列的類型
* 并發(fā)隊列
獲得全局的并發(fā)隊列: dispatch_get_global_queue
* 串行隊列
a.自己創(chuàng)建
dispatch_queue_create
b.主隊列
dispatch_get_main_queue
2> 執(zhí)行任務的方法類型
* 同步(sync)執(zhí)行
* 異步(async)執(zhí)行
3> 了解隊列和方法的配合使用
4> 線程間通信
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_
PRIORITY_DEFAULT, 0), ^{
// 執(zhí)行耗時的異步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主線程,執(zhí)行UI刷新操作
});
});
5> 其他用法
dispatch_once
dispatch_after
dispatch_group_async/dispatch_group_notify
3.NSOperation
1> 基本使用
NSInvocationOperation
NSBlockOperation
2> NSOperationQueue(重點)
* 最大并發(fā)數(shù)設置
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
注意:此方法僅能限制同時執(zhí)行的線程數(shù),不能限制特定的線程(即可能每次執(zhí)行的線程組都是不一樣的)
* 設置依賴(面試題)
[operationB addDependency:operationA]; // 操作B依賴于操作A
3> 自定義Operation(了解基本流程)
4> 如何解決一張圖片(一個url)重復下載的問題(面試題)