iOS GCD多线程介绍
GCD:是纯C语言写的,是苹果公司为多核的并行运算提出的解决方案。
GCD的两个核心概念: - 任务 - 队列
将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 - 创建串行队列
// "WE" 为线程的名称 // DISPATCH_QUEUE_SERIAL 串行 dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL); // 也可以这样设置 串行默认为NULL dispatch_queue_t queue = dispatch_queue_create("WE", NULL)
-创建队列
//DISPATCH_QUEUE_CONCURRENT 并行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
- 异步执行
dispatch_async(queue, ^{ // });
- 同步执行
dispatch_sync(queue, ^{ // });
GCD的几种用法 - 串行队列,同步执行-----不开线程,同步执行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 5; ++i) { // 同步执行 dispatch_sync(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); }); }
- 串行队列,异步执行-----开一个线程,顺序执行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 5; ++i) { // 异步执行 dispatch_async(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); }); }
- 并行队列,异步执行-----开多个线程,异步执行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 10; ++i) { // // 异步执行 dispatch_async(queue, ^{ NSLog(@"异步>%d--%@",i,[NSThread currentThread]); }); }
- 并行队列,同步执行-----不开线程,顺序执行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 10; ++i) { // 同步执行 dispatch_sync(queue, ^{ NSLog(@"同步>%d--%@",i,[NSThread currentThread]); }); }
- 主队列,异步任务-----不开线程,同步执行
dispatch_queue_t queue = dispatch_get_main_queue(); for (int i = 0; i < 5; ++i) { // // 异步执行 dispatch_async(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); }); }
- 主队列,同步执行-----程序执行不出来(死锁) 死锁的原因,当程序执行到下面这段代码的时候
1) 主队列:如果主线程正在执行代码,就不调度任务
2) 同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务,此时互相等待,程序无法往下执行(死锁)
- 全局队列(本质就是并发队列)
//第一个参数:iOS7和iOS8中适配此参数 可以直接传入0 //第二个参数:为将来保留使用,始终传入0 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); for (int i = 0; i < 5; ++i) { // 并行执行 dispatch_async(queue, ^{ NSLog(@"%d--%@",i,[NSThread currentThread]); }); }