關於多執行緒的理解(不定時更新)
下面會以一小個一小個的知識點進行表達(可能想到哪就寫到哪)
1.每一個程式都相當於一個程序,每個程序,系統都會為其分配獨立的記憶體空間執行,所以,ios中每一個app應用都相當於一個程序。
2.一個程序中執行的所有任務都是線上程(Thread)中進行的,每個程序至少有一個執行緒,也就是所謂的主執行緒,(下圖)

程序、執行緒的關係
3.app一旦開始執行,就會預設開啟一條執行緒、也就是所謂的“主執行緒”。主執行緒的任務一般是:重新整理UI;處理UI事件(滑動螢幕、點選....)
4.如果主執行緒中的操作太多,會造成頁面的卡頓、發燙等現象,所以我們會把耗時的任務放在子執行緒中併發執行,待執行完畢再通知主執行緒做相應的變化
5.執行緒是程式執行流的最小單元,是程序中的一個實體。有自己的棧和暫存器.
進階
多執行緒的優點:
1.因為可以併發 所以提高了程式的執行效率
2.提高資源的利用率
3.耗時多的任務可以放線上程中,這樣不會造成程式卡頓
多執行緒的缺點 :
1.執行緒越多,CPU在排程執行緒上的開銷就越大,佔用的記憶體空間越大
2.執行緒越多,程式設計就越複雜,比如執行緒之間的通訊,多執行緒的資料共享,這些都需要程式的處理,增加了程式的複雜度。
多執行緒的種類
1.PThread:(C語言)
2.NSThread
3.GCD
4.NSOpreation
NSThread
三種開啟方法:
1.動態開啟:手動開啟
NSThread*thread1 = [[NSThrea dalloc] initWithTarget:selfselector:@selector(doSomething1:) object:(@"NSThread1")];[thread1 start];
2.靜態開啟:建立好直接開啟
[NSThread detachNewThreadSelector:@selector(doSomething2:) toTarget:selfwithObject:(@"NSTread2")];
3.隱式開啟:建立後直接開啟
[selfperformSelectorInBackground:@selector(doSomething3:) withObject:(@"NSTread3")];
【NSthread currentThread】:當前執行緒 【NSthread mainThread】:主執行緒
執行緒之間通訊
//在指定執行緒上執行操作
[self performSelector:@selector(run) onThread:thread withObject:nilwaitUntilDone:YES];
//在主執行緒上執行操作
[self performSelectorOnMainThread:@selector(run) withObject:nilwaitUntilDone:YES];
//在當前執行緒執行操作
[self performSelector:@selector(run) withObject:nil];
GCD(Grand Central Dispatch)
優點:
1.自動管理執行緒的生命週期
2.可用於多核運算
序列佇列:(主佇列、主執行緒)先進先出 當執行完一個任務時候 再接著往下進行下一個任務
並行佇列:

異常一
如上程式碼:會崩潰
分析崩潰原因:
所有的程式,預設就一個主佇列和一個主執行緒,因此viewDidLoad函式這段任務就在主佇列中同步執行,dispatch_sync...這段程式碼表示把B處任務加入主佇列中,並且同步執行,這就出問題,B處任務要等主佇列中同步執行之前的case1這段任務結束後執行,但B處任務在case1這段任務中,case1又要等B處任務執行完才能繼續執行。case1任務要等B處完成才能繼續,但case1又排在B處前面,這就尷尬了,所以gg了 :joy: