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