iOS GCD多執行緒
直接上程式碼 --> 各種執行緒的建立方式
/// 建立非同步佇列 dispatch_queue_t async = dispatch_queue_create("async_queue", DISPATCH_QUEUE_CONCURRENT); /// 建立同步佇列 dispatch_queue_t sync = dispatch_queue_create("sync_queue", DISPATCH_QUEUE_SERIAL); /// 建立主佇列 dispatch_queue_t main_queue = dispatch_get_main_queue(); /// 全域性併發佇列 dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); /// 同步 dispatch_sync(global_queue, ^{ }); /// 非同步 dispatch_async(global_queue, ^{ });
執行緒建立的6中方式
第一種 --> 同步併發(從上往下依次執行,沒有開啟新執行緒) 在當前執行緒中執行任務,不會開啟新執行緒,執行完一個任務,再執行下一個任務
| 執行結果 --> 新增至主執行緒執行先執行begin最後執行end,依次執行
- (void)syncConcurrentThread { NSLog(@"同步併發---begin %@",[NSThread currentThread]); dispatch_queue_t sync = dispatch_queue_create("syncConcurrent", DISPATCH_QUEUE_CONCURRENT); dispatch_sync(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncConcurrent = 1--%@",[NSThread currentThread]); } }); dispatch_sync(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncConcurrent = 2--%@",[NSThread currentThread]); } }); dispatch_sync(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncConcurrent = 3--%@",[NSThread currentThread]); } }); NSLog(@"同步併發---end %@",[NSThread currentThread]); } 執行結果: 同步併發---begin <NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 1--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 1--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 1--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 2--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 2--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 2--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 3--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 3--<NSThread: 0x600000566940>{number = 1, name = main} syncConcurrent = 3--<NSThread: 0x600000566940>{number = 1, name = main} 同步併發---end <NSThread: 0x600000566940>{number = 1, name = main}
第二種 --> 非同步併發(開啟多個新執行緒,任務隨機接近同時執行) 可以開啟多個執行緒,任務同時隨機執行
| 執行結果 --> 先執行主執行緒程式碼(begin,end),在執行子執行緒程式碼,並隨機執行
- (void)asyncConcurrentThread { NSLog(@"非同步併發---begin %@",[NSThread currentThread]); dispatch_queue_t sync = dispatch_queue_create("syncConcurrent", DISPATCH_QUEUE_CONCURRENT); dispatch_async(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncConcurrent = 1--%@",[NSThread currentThread]); } }); dispatch_async(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncConcurrent = 2--%@",[NSThread currentThread]); } }); dispatch_async(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncConcurrent = 3--%@",[NSThread currentThread]); } }); NSLog(@"非同步併發---end %@",[NSThread currentThread]); } 執行結果: 非同步併發---begin <NSThread: 0x600000566940>{number = 1, name = main} 非同步併發---end <NSThread: 0x600000566940>{number = 1, name = main} asyncConcurrent = 1--<NSThread: 0x600000538980>{number = 3, name = (null)} asyncConcurrent = 3--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncConcurrent = 2--<NSThread: 0x60000050ad40>{number = 5, name = (null)} asyncConcurrent = 1--<NSThread: 0x600000538980>{number = 3, name = (null)} asyncConcurrent = 3--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncConcurrent = 2--<NSThread: 0x60000050ad40>{number = 5, name = (null)} asyncConcurrent = 1--<NSThread: 0x600000538980>{number = 3, name = (null)} asyncConcurrent = 3--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncConcurrent = 2--<NSThread: 0x60000050ad40>{number = 5, name = (null)}
第三種 --> 同步序列 (任務依次執行,沒有開啟新執行緒) 不會開啟新執行緒,在當前執行緒執行任務。任務是序列的,執行完一個任務,再執行下一個任務
| 執行結果 --> 先執行主執行緒的程式碼(begin,end),在加入主執行緒依次執行
- (void)syncSerialThread { NSLog(@"同步序列---begin %@",[NSThread currentThread]); dispatch_queue_t sync = dispatch_queue_create("syncConcurrent", DISPATCH_QUEUE_SERIAL); dispatch_sync(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncSerial = 1--%@",[NSThread currentThread]); } }); dispatch_sync(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncSerial = 2--%@",[NSThread currentThread]); } }); dispatch_sync(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncSerial = 3--%@",[NSThread currentThread]); } }); NSLog(@"同步序列---end %@",[NSThread currentThread]); } 執行結果: 同步序列---begin <NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 1--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 1--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 1--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 2--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 2--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 2--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 3--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 3--<NSThread: 0x600000566940>{number = 1, name = main} syncSerial = 3--<NSThread: 0x600000566940>{number = 1, name = main} 同步序列---end <NSThread: 0x600000566940>{number = 1, name = main}
第四種 --> 非同步序列 (開啟一個執行緒) 會開啟新執行緒,但是因為任務是序列的,執行完一個任務,再執行下一個任務
| 執行結果 --> 先執行主執行緒(begin,end),然後在新的執行緒依次執行任務
- (void)asyncSerialThread { NSLog(@"非同步序列---begin %@",[NSThread currentThread]); dispatch_queue_t sync = dispatch_queue_create("syncConcurrent", DISPATCH_QUEUE_SERIAL); dispatch_async(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncSerial = 1--%@",[NSThread currentThread]); } }); dispatch_async(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncSerial = 2--%@",[NSThread currentThread]); } }); dispatch_async(sync, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncSerial = 3--%@",[NSThread currentThread]); } }); NSLog(@"非同步序列---end %@",[NSThread currentThread]); } 執行結果: 非同步序列---begin <NSThread: 0x600000566940>{number = 1, name = main} 非同步序列---end <NSThread: 0x600000566940>{number = 1, name = main} asyncSerial = 1--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 1--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 1--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 2--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 2--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 2--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 3--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 3--<NSThread: 0x600000538880>{number = 4, name = (null)} asyncSerial = 3--<NSThread: 0x600000538880>{number = 4, name = (null)}
第五種 --> 同步執行 + 主佇列 在主執行緒呼叫(卡死) 在其他執行緒呼叫(不會卡死,不會開啟新執行緒,依次執行)
| 執行結果 --> 在主佇列執行(卡死) 在子執行緒中(依次執行)
- (void)syncMainThread { NSLog(@"同步執行 + 主佇列 ---begin %@",[NSThread currentThread]); dispatch_queue_t main_queue = dispatch_get_main_queue(); dispatch_sync(main_queue, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncMain = 1--%@",[NSThread currentThread]); } }); dispatch_sync(main_queue, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncMain = 2--%@",[NSThread currentThread]); } }); dispatch_sync(main_queue, ^{ for (int i = 0; i < 3; i++) { NSLog(@"syncMain = 3--%@",[NSThread currentThread]); } }); NSLog(@"同步執行 + 主佇列 ---end %@",[NSThread currentThread]); } 執行結果: ---begin <NSThread: 0x6000011b6940>{number = 1, name = main}
第六種 --> 非同步執行 + 主佇列 在主執行緒中依次執行
| 執行結果 --> 先執行主線(begin,end),然後依次執行任務
- (void)asyncMainThread { NSLog(@"非同步執行 + 主佇列 ---begin %@",[NSThread currentThread]); dispatch_queue_t main_queue = dispatch_get_main_queue(); dispatch_async(main_queue, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncMain = 1--%@",[NSThread currentThread]); } }); dispatch_async(main_queue, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncMain = 2--%@",[NSThread currentThread]); } }); dispatch_async(main_queue, ^{ for (int i = 0; i < 3; i++) { NSLog(@"asyncMain = 3--%@",[NSThread currentThread]); } }); NSLog(@"非同步執行 + 主佇列 ---end %@",[NSThread currentThread]); } 執行結果: 非同步執行 + 主佇列 ---begin <NSThread: 0x6000018f6980>{number = 1, name = main} 非同步執行 + 主佇列 ---end <NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 1--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 1--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 1--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 2--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 2--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 2--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 3--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 3--<NSThread: 0x6000018f6980>{number = 1, name = main} asyncMain = 3--<NSThread: 0x6000018f6980>{number = 1, name = main}