iOS開發-多線程的一些基礎知識
多線程
首先介紹一下進程和線程
進程
-
進程代表當前運行的一個程序(是系統分配資源的基本單位,可以理解為一個工廠)
Paste_Image.psng
線程
-
線程是cpu調度的最小單位,一個進程含有一個線程或多個線程(應用程序打開后會默認開辟一個線程,叫做主線程或者UI線程,線程可以理解為工人里的一個工人
多線程的原理
-
同一時間,CPU只能處理1條線程,只有1條線程在工作(執行)
-
多線程并發(同時)執行,其實是CPU快速地在多條線程之間調度(切換)
-
如果CPU調度線程的時間足夠快,就造成了多線程并發執行的
-
創建的線程不易過多:
CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源
每條線程被調度執行的頻次會降低(線程的執行效率降低)
多線程的缺點
-
創建線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用-setStackSize:設置,但必須是4K的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間
-
如果開啟大量的線程,會降低程序的性能
-
線程越多,CPU在調度線程上的開銷就越大
-
程序設計更加復雜:比如線程之間的通信、多線程的數據共享
主線程
-
什么是主線程
一個iOS程序運行后,默認會開啟1條線程,稱為“主線程”或“UI線程”
-
主線程的主要作用
顯示\刷新UI界面
處理UI事件(比如點擊事件、滾動事件、拖拽事件等)
-
主線程的使用注意
別將比較耗時的操作放到主線程中
耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗
串行-并行-并發區別
- 串行:多個任務按順序執行,類似于一個窗口辦公排隊
執行順序 下載文件A->下載文件B->下載文件C,也可以認為線程是進程中的一條文件路徑
-
并行:多個任務同一時間一起執行,類似于多個窗口辦公
-
并發:多個任務看似是同一時間一起執行,但實際上是CPU快速的輪轉切換造成的假象
-
ps:我們使用多線程其實就是并發編程
使用多線程的優點:
-
可以減少多個任務執行所需要的總時長,提升cpu利用率
使用多線程的缺點:
-
1.線程需要耗費系統資源 ,主線程要消耗棧空間的1MB資源,其他線程每個消耗512KB資源,不要過多使用
-
2.線程使用過多會使程序變得復雜,容易出現問題,不容易調試維護
耗時操作建議放到子線程中(后臺線程,非子線程)
多線程實現方案
打印當前線程
NSLog(@"當前線程 : %@",[NSThread currentThread]);
打印主線程
NSLog(@"主線程 : %@",[NSThread mainThread]);
判斷線程是否是主線程
BOOL isMainThread = [NSThread isMainThread];
休眠
[NSThread sleepForTimeInterval:3.0];
創建一個線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
//設置線程名
thread.name = @"sq線程";//設置線程優先級(The thread’s priority, which is specified by a floating point number from 0.0 to 1.0, where 1.0 is highest priority.) thread.threadPriority = 1.0f;
//需要手動開啟線程 [thread start];</code></pre>
通過類方法創建一個線程(不推薦,設置不了相關屬性(如姓名等)
[NSThread detachNewThreadSelector:@selector(threadAction) toTarget:self withObject:nil];
在后臺執行一個方法(耗時操作)
[self performSelectorInBackground:@selector(backgroundAction) withObject:nil];
在前臺執行一個方法(如UI刷新操作需要在主線程中進行)
[self performSelectorOnMainThread:@selector(mainAction) withObject:nil waitUntilDone:YES];
//參數1:需要在主線程中執行的方法 //參數2:傳值 //參數3:是否阻塞線程(等待執行完成后繼續執行后面代碼)</code></pre>
A 線程鎖(比較耗資源,不建議用)
-
在線程鎖中只有一個線程執行完之后其他線程才能進入
//通常用self作標簽 @synchronized (self) {}
來自:http://www.jianshu.com/p/f354872cd5b5
-