iOS 多线程基本概念
容易混淆的几点
- 同步与异步
同步:不会开启新线程
异步:可以开启新线程(但不代表一定会开启新线程)
- 串行与并发
串行:任务一个一个执行
并发:多个任务同时执行(通常与异步配合使用从而实现多线程)
队列的创建串行队列与并发队列都有两种创建方式
- 串行队列的创建
// 手动创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
// 系统主队列
dispatch_queue_t main_queue = dispatch_get_main_queue();
- 并发队列的创建
// 手动创建并发队列
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);
// 系统并发队列
dispatch_queue_t globl_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
几种组合
- 异步串行队列
// 1.手动创建串行队列(会开启新线程,任务串行执行)
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{ NSLog(@"test"); });
//2.系统主队列(不会开启新线程,任务串行执行)
dispatch_queue_t main_queue = dispatch_get_main_queue();dispatch_async(main_queue, ^{ NSLog(@"test"); });
- 异步并发队列
// 不管手动创建还是使用系统的并发队列,都会开启新线程,并且任务并发执行
// 手动创建并发队列
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{ NSLog(@"test"); });
// 系统并发队列
dispatch_queue_t globl_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globl_queue, ^{ NSLog(@"test"); });
- 同步串行队列 与 同步并发队列
//这两种情况都不会开启新线程,并且任务都是串行执行```
# 注意
- 不要在主线程中使用dispatch_sync(),会造成死锁.