一、概念:
進程:
系統中正在運行的一個應用程序;
每個進程之間是獨立的,每個進程均運行在其專用且受保護的內存空間內。
線程:
1個進程要想執行任務,必須得有線程(每1個進程至少要有1條線程);
1個進程(進程)的所有任務都在線程中執行。
線程的串行
1個線程中,任務的執行是串行的。線程是進程中的1條執行路徑。
多線程:
1個進程可以開啟多條線程,每條線程可以
并行(同時)
執行不同的任務。多線程的原理:
同一時間,CPU只能處理1條線程,只有1條線程在工作(執行);
多線程并發(同時)執行,其實是CPU快速地在多條線程之間
調度
(切換);如果CPU調度線程的時間足夠快,就造成了多線程并發執行的假象。
-
如果線程非常非常多:
- CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源;
- 每條線程被調度執行的頻次會降低(線程的執行效率降低)。
多線程的優缺點:
-
多線程的優點:
- 能適當提高程序的執行效率;
- 能適當提高資源利用率(CPU、內存)。
-
多線程的缺點:
- 創建線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用 -setStackSize: 設置,但必須是4K 的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間;
- 如果開啟大量的線程,會降低程序的性能;
- 線程越多,CPU在調度線程上的開銷就越大;
- 程序設計更加復雜:比如線程之間的通信、多線程的數據共享。
二、應用:
- pthread:了解,很少使用,純C語言;
- NSThread:掌握
-
創建線程的三種方式:
方式一:
-
NSThread *thread = [NSThread alloc] initWithTarget: selector: object:];
[thread start];
方式二:
````objc
[NSThread detachNewThreadSelector: toTarget: withObject:];
方式三:
[self performSelectorInBackground: withObject:];
后兩種方式優點是:簡單快捷;缺點:無法對線程進行更詳細的設置。
- GCD:使用最多;
- NSOperation:使用第二多。
三、多線程安全隱患解決 - 互斥鎖(線程同步)
- 使用格式:
@synchronized(所對象){//需要鎖定的代碼}
注意:鎖定1份代碼只用1把鎖,使用多把鎖是無效的
-
使用互斥鎖的優缺點:
- 優點:能有效防止因多線程搶奪資源造成的數據安全問題;
- 缺點:需要消耗大量的CPU資源。
互斥鎖的使用前提:多條線程搶奪同一塊資源。
原子和非原子屬性:
-
OC在定義屬性時有 nonatomic 和 atomic 兩種選擇:
- atomic:原子屬性,為setter方法加鎖(默認就是atomic);
- nonatomic:非原子屬性,不會為setter方法加鎖。
四、線程間通信:
- 去子線程的方法:
[self performSelectorInBackground: withObject:];
- 回主線程常用方法:
[self performSelectorOnMainThread: withObject: waitUntilDone:]; //其中 self 可以換成具體對象
//也可以在拿到對象之后調用方法
[image performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject: waitUntilDone:];