iOS 多線程基本概念
容易混淆的幾點
- 同步與異步
同步:不會開啟新線程
異步:可以開啟新線程(但不代表一定會開啟新線程)
- 串行與并發(fā)
串行:任務(wù)一個一個執(zhí)行
并發(fā):多個任務(wù)同時執(zhí)行(通常與異步配合使用從而實現(xiàn)多線程)
隊列的創(chuàng)建串行隊列與并發(fā)隊列都有兩種創(chuàng)建方式
- 串行隊列的創(chuàng)建
// 手動創(chuàng)建串行隊列
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
// 系統(tǒng)主隊列
dispatch_queue_t main_queue = dispatch_get_main_queue();
- 并發(fā)隊列的創(chuàng)建
// 手動創(chuàng)建并發(fā)隊列
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);
// 系統(tǒng)并發(fā)隊列
dispatch_queue_t globl_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
幾種組合
- 異步串行隊列
// 1.手動創(chuàng)建串行隊列(會開啟新線程,任務(wù)串行執(zhí)行)
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{ NSLog(@"test"); });
//2.系統(tǒng)主隊列(不會開啟新線程,任務(wù)串行執(zhí)行)
dispatch_queue_t main_queue = dispatch_get_main_queue();dispatch_async(main_queue, ^{ NSLog(@"test"); });
- 異步并發(fā)隊列
// 不管手動創(chuàng)建還是使用系統(tǒng)的并發(fā)隊列,都會開啟新線程,并且任務(wù)并發(fā)執(zhí)行
// 手動創(chuàng)建并發(fā)隊列
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{ NSLog(@"test"); });
// 系統(tǒng)并發(fā)隊列
dispatch_queue_t globl_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globl_queue, ^{ NSLog(@"test"); });
- 同步串行隊列 與 同步并發(fā)隊列
//這兩種情況都不會開啟新線程,并且任務(wù)都是串行執(zhí)行```
# 注意
- 不要在主線程中使用dispatch_sync(),會造成死鎖.