一.runloop跟線程的關(guān)系
- runloop是為線程而生,每一個(gè)線程會(huì)對(duì)應(yīng)一個(gè)runloop;
- 主線程runloop默認(rèn)是開啟的,子線程runloop需要手動(dòng)開啟;
3.可通過以下方式開啟一條常駐線程:
NSRunLoop * runloop = [NSRunLoop currentRunLoop];
[runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[runloop run];
二. 線程之間的通信
1.GCD,一般用于UI更新
dispatch_async(dispatch_get_main_queue(), ^{
//主線程操作UI更新
});
- performSelector
a)performSelectorOnMainThread: withObject: waitUntilDone://切回主線程操作
b)performSelectorInBackground: withObject://切換到后臺(tái)線程
c)performSelector: onThread: withObject: waitUntilDone://切換到自定義子線程 - NSOperation
[NSOperationQueue mainQueue] addOperationWithBlock: ^{}
三. 線程鎖有幾種
1 NSLock
2 synchronized代碼塊
3 GCD的 dispatch_semaphore_t(條件信號(hào)量)和dispatch_barrier_async/dispatch_barrier_sync;
4 NSCondition 使用其做多線程之間的通信調(diào)用不是線程安全的
5 NSConditionLock 單純加鎖性能非常低,比NSLock低很多,但是可以用來做多線程處理不同任務(wù)的通信調(diào)用
6 POSIX(pthread_mutex) 底層的api,復(fù)雜的多線程處理建議使用,并且可以封裝自己的多線程
7 NSRecursiveLock 遞歸鎖的性能出奇的高,但是只能作為遞歸使用,所以限制了使用場景