標籤:
iOS的三種多線程技術 1.NSThread 每個NSThread對象對應一個線程,量級較輕(真正的多線程)2.以下兩點是蘋果專門開發的“並發”技術,使得程式員可以不再去關心線程的具體使用問題ØNSOperation/NSOperationQueue 物件導向的線程技術ØGCD —— Grand Central Dispatch(派發) 是基於C語言的架構,可以充分利用多核,是蘋果推薦使用的多線程技術
以上這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的,在項目中很多架構技術分別使用了不同多線程技術。
2.三種多線程技術的對比 •NSThread:–優點:NSThread 比其他兩個輕量級,使用簡單–缺點:需要自己管理線程的生命週期、線程同步、加鎖、睡眠以及喚醒等。線程同步對資料的加鎖會有一定的系統開銷 •NSOperation:–不需要關心線程管理,資料同步的事情,可以把精力放在自己需要執行的操作上–NSOperation是物件導向的 •GCD:–Grand Central Dispatch是由蘋果開發的一個多核編程的解決方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和強大的技術–GCD是基於C語言的
3.GCD中有三種隊列類型:
- The main queue: 與主線程功能相同。實際上,提交至main queue的任務會在主線程中執行。main queue可以調用dispatch_get_main_queue()來獲得。因為main queue是與主線程相關的,所以這是一個串列隊列。
- Global queues: 全域隊列是並發隊列,並由整個進程共用。進程中存在三個全域隊列:高、中(預設)、低三個優先順序隊列。可以調用dispatch_get_global_queue函數傳入優先順序來訪問隊列。
- 使用者隊列: 使用者隊列 (GCD並不這樣稱呼這種隊列, 但是沒有一個特定的名字來形容這種隊列,所以我們稱其為使用者隊列) 是用函數
dispatch_queue_create 建立的隊列. 這些隊列是串列的。正因為如此,它們可以用來完成同步機制, 有點像傳統線程中的mutex。
串列隊列同步:操作不會建立線程、操作順序執行
串列隊列非同步:操作需要一個子線程,會建立線程、線程的建立和回收不需要程式員參與,操作順序執行,“最安全的選擇”
並行隊列同步:操作不會建立線程、操作順序執行
並行隊列非同步:操作會建立多個線程(有多少任務,就開n個線程執行)、操作無序執行;隊列前如果有其他任務,會等待前面的任務完成之後再執行;情境:既不影響主線程,又不需要順序執行的操作!
全域隊列非同步:操作會建立多個線程、操作無序執行,隊列前如果有其他任務,會等待前面的任務完成之後再執行。相當於串列隊列。
全域隊列同步:操作不會建立線程、操作順序執行
主隊列非同步:操作都應該在主線程上順序執行的,不存在
4,。不同隊列嵌套dispathch_sync(同步)任務的結果:
// 1.全域隊列,都在主線程上執行,不會死結 dispatch_queue_priority_default
dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);
// 2.並行隊列,都在主線程上執行,不會死結 dispatch_queue_concurrent
dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_concurrent);
// 3.串列隊列,會死結,但是會執行嵌套同步操作之前的代碼 dispatch_queue_serial
dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_serial);
// 4.主隊列,直接死結 dispatch_get_main_queue();
dispatch_queue_t q = dispatch_get_main_queue();
dispatch_sync(q, ^{
nslog(@"同步任務 %@", [nsthread currentthread]);
dispatch_sync(q, ^{
nslog(@"同步任務 %@", [nsthread currentthread]);
});
});
iOS的多線程技術