在軟件開發中必不可少的會接觸到一個詞語--多線程;
那么什么是多線呢,本文主要是對多線程的基礎知識做簡單講解。
1 基本概念
1.1 進程的概念
-
進程是指在系統正在運行的一個應用程序,每個進程是相對獨立
eg: 當我們啟動QQ,那么就會開啟一個進程
1.2 線程的概念
- 每個進程中至少要有一條線程。(一個程序的所有任務都是在線程中執行的)
- 一個線程中任務的執行是
串行的
1.3 多線程的概念
- 一個進程中可以開多條線程,每條線程可以并行(同時)執行
- 主線程 : 自動創建的,默認的 又叫UI線程
- 子線程 : 又叫后臺線程
多線程原理
- CPU同一時間只能有一條線程在工作,其實是CPU快速的在多條線程之間調度(切換);調度頻率快,就形成了多線程同時執行的“假象”。所以移動端不建議開太多線程一般在5條以內
多線程優缺點
- 優點:能適當提高執行效率、資源(CPU,內存)利用率
- 缺點:開啟線程占用內存,開銷大,性能降低
多線程在iOS開發中的應用
-
默認有一條主線程(UI線程)有且只有一條。作用:負責顯示和刷新界面,處理UI事件
注意:不要把耗時操作放在主線程中
2 iOS中多線程的實現方案
3 pthread的例子
- (void)viewDidLoad {
[super viewDidLoad];
// 創建一個線程標識符
pthread_t myrestrict;
// 1param 線程標識符變量的地址, 2param 寫NULL 3param 執行的的函數 4param NULL
pthread_create(&myrestrict, NULL, run, NULL);
}
// 定義線程的函數
void *run(void *data) {
NSLog(@"%@", [NSThread currentThread]);
return nil;
}
4 NSThread的基本用法
創建方式1 創建后需啟動
//創建線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download) object:nil];
// 啟動線程
[thread start];
創建方式2 創建后自動啟動
// 創建后直接啟動 傳一個字符串
[NSThread detachNewThreadSelector:@selector(download2:) toTarget:self withObject:@"param"];
創建方式3 隱式啟動
// 開啟子線程
[self performSelectorInBackground:@selector(download) withObject:nil];
// 開啟主線程
[self performSelector:@selector(download) withObject:nil];
// 開啟傳入的線程
[self performSelector:@selector(download) onThread:[NSThread currentThread] withObject:nil waitUntilDone:NO];
其它常用方法
// 獲取當前線程
NSThread *current = [NSThread currentThread];
// 獲取主線程
NSThread *main = [NSThread mainThread];
// 判斷是否主線程-類方法
BOOL isMain = [NSThread isMainThread];
// 判斷是否主線程-對象方法
BOOL isMain2 = [main isMainThread];
// 給線程起名字
current.name = @"下載線程";
// 線程睡眠狀態5秒
[NSThread sleepForTimeInterval:5.0];
// 線程睡眠從現在開始3秒以后的時間
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
// 線程退出 線程進入死亡狀態
[NSThread exit];
線程之間的通信
[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
- waitUntilDone: 是否等待執行完 performSelector:執行的方法 withObject: 傳參數
5.線程安全
- 線程安全
- 概念 : 多個線程奪取同一個資源,訪問一個變量
- 解決方案 : 加鎖--線程鎖, 互斥鎖
- 互斥鎖的格式 :
@synchronized(self) {
// 插入鎖定代碼
}
* >注意 : 一份代碼只能用一個鎖, 多個鎖無效
-
線程鎖優缺點
- 優點 : 能夠有效防止因多線程搶奪資源造成的數據安全問題
- 缺點 : 消耗大量CPU資源
-
線程同步
- 多條線程在同一條線上執行(按順序執行)
- 互斥鎖就運用了線程同步
-
原子屬性和非原子屬性
- atomic 會自動為setter方法加鎖
- nonatomic 不會為setter方法 推薦使用這個