寫這篇博客的目的是為了跟大家分享本人對多線程的一些淺顯的理解,順道梳理一遍自己掌握的知識,如有不妥之處,歡迎各位大牛指正.首先要理解兩個概念:進程(Process):程式的一次運行,擁有獨立的記憶體地址空間(一個iOS應用只有一個進程).線程(Thread):1.線程是進程的基本執行單元,是操作系統可...
寫這篇博客的目的是為了跟大家分享本人對多線程的一些淺顯的理解,順道梳理一遍自己掌握的知識,如有不妥之處,歡迎各位大牛指正.
首先要理解兩個概念:
進程(Process):程式的一次運行,擁有獨立的記憶體地址空間(一個iOS應用只有一個進程).
線程(Thread):
1.線程是進程的基本執行單元,是操作系統可以調度的最小單元,一個進程中可以有多個線程,也至少有一個線程.
2.多個線程共用進程的地址空間,每個線程都有自己的棧空間,共用堆空間.
3.多個線程可以同步執行,目的在於提高CPU資源利用率.
多線程優缺點:
優點:可以提高CPU利用率,防止阻塞主線程,避免使UI出現假死(卡頓)現象,這裡提醒大家,程式展現給用戶看的,有關UI界面的更新儘可能的在主線程中處理,主線程也儘可能的只處理UI的更新和展示,其他的比如數據的處理之類的操作都放到子線程中,這樣就避免了用戶與應用界面的交互出現卡頓延遲現象.
缺點:每個線程都有自己的線程棧,需要占據一定的空間;線程調度需要消耗CPU時間;程式設計更加複雜,需要考慮線程間通信、數據共用和數據安全等問題。
iOS多線程的方法:
1.C語言介面:pthread.
2.NSThread
3.NSOperation
4.GCD
這裡暫時只介紹GCD.
GCD(Grand Central Dispatch)是一種非同步執行任務的技術。封裝了多線程開發中的難點“線程管理”,開發者只需要定義任務,並提交到分發隊列(Dispatch Queue),由GCD自動管理和調度。
GCD使用block定義任務,可以同步或者非同步提交任務。
//同步提交任務,queue為任務隊列 dispatch_sync(queue,^{ /*任務*/ }; //非同步提交任務 dispatch_async(queue,^{ /*任務*/ };
dispath_sync方法會等待任務執行完成才返回,等待意味著執行dispatch_sync的線程“暫停”,且不能提交任務到當前線程(提交任務的線程,易死鎖)。
dispath_async方法不會等待任務執行完成就會返回。
隊列的類型:
GCD有兩種隊列類型:
串列隊列:等待前一個任務執行完成。串列隊列中的任務按先進先出(FIFO)的規則執行,並且前一個任務執行完,才能處理後一個任務,且只使用一個線程處理隊列。
並行隊列:不等待前面的任務執行完成。並行隊列使用多個線程同時處理隊列,同時執行的任務數與線程的數目有關,線程的數目與CPU核心數目、CPU負載等相關,打個比方,並行隊列下有一個任務:從1數到100
for (int i = 0; i < 100; i++) { /**<此方法是獲取系統全局隊列,全局隊列是一個並行隊列。*/ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"i = %d",i); }); }
能發現進程ID始終是59249,而線程ID卻有多個,列印的數字也不是按照規範的順序,這是因為線程非同步處理的原因,每個線程都在“爭搶”執行任務,而CPU會根據目前的狀態安排一定數目的線程執行任務,每一個線程執行完任務後繼續執行下一個任務。PS:隊列安排線程去完成任務,線程是幫我們處理任務的,主隊列主線程只有一個,讓系統主線程少乾我們安排的任務,以便保證UI的流暢性,再次強調更新UI一定要放在主線程上。
--------分割線,有空再接著寫-------