ios多线程 -- GCD介绍
2016-06-27 19:15
274 查看
GCD (纯C语言) 全称 Grand Central Dispatch,可译为“伟大的中枢调度器”
优点:
(1) GCD是为多核的并行运算提出的解决方案
(2) GCD会自动利用更多的CPU内核(比如双核、四核)
(3) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
(4) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
核心概念:
(1) 任务(block):执行什么任务
(2) 队列(queue):用来存放任务
使用步骤:
(1) 定制任务:确定要执行的操作
(2) 将任务添加到队列中: GCD 会自动将队列中的任务取出,放到对应的线程来执行;任务的取出遵守队列的 FIFO 原则 (先进先出).
GCD执行任务的常用函数
(1) 用同步的方式
(2) 用异步的方式
同步异步区别:
(1) 同步: 只能在当前线程中执行, 不具备开启线程的能力
(2) 异步: 可以在新线程中执行, 具备开启线程的能力.
GCD队列的类型(3种)
并发队列(全局队列):可以让对个任务并发(同时)执行, 自动开启多个线程,同时执行任务;(并发的功能只能在异步执行的时候才有效).
串行队列:让任务一个接一个执行,一个任务执行完毕,才能执行下一个任务.
串行队列的特殊情况:主队列:
补充:
同步和异步:主要影响能不能开启新的线程
同步:不具备开启新线程的能力
异步:具备开启线程的能力
并发和串行主要影响任务的执行方式
并发: 多个任务并发(同时)执行
串行:一个任务执行完毕,下一个任务才开始执行.
组合方式
异步 并发队列(最常用)
![](http://img.blog.csdn.net/20160627192020720)
异步 串行队列(偶尔用)
![](http://img.blog.csdn.net/20160627191344123)
异步 主队列(经常用)
优点:
(1) GCD是为多核的并行运算提出的解决方案
(2) GCD会自动利用更多的CPU内核(比如双核、四核)
(3) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
(4) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
核心概念:
(1) 任务(block):执行什么任务
(2) 队列(queue):用来存放任务
使用步骤:
(1) 定制任务:确定要执行的操作
(2) 将任务添加到队列中: GCD 会自动将队列中的任务取出,放到对应的线程来执行;任务的取出遵守队列的 FIFO 原则 (先进先出).
GCD执行任务的常用函数
(1) 用同步的方式
/** * 参数说明 * @param queue 队列 * @param void 任务 */ dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
(2) 用异步的方式
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步异步区别:
(1) 同步: 只能在当前线程中执行, 不具备开启线程的能力
(2) 异步: 可以在新线程中执行, 具备开启线程的能力.
GCD队列的类型(3种)
并发队列(全局队列):可以让对个任务并发(同时)执行, 自动开启多个线程,同时执行任务;(并发的功能只能在异步执行的时候才有效).
/** * 优先级 * DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高 * DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中) * DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台 */ dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
串行队列:让任务一个接一个执行,一个任务执行完毕,才能执行下一个任务.
dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL); //dispatch_release(queue); // 非ARC需要释放手动创建的队列
串行队列的特殊情况:主队列:
dispatch_get_main_queue()
补充:
同步和异步:主要影响能不能开启新的线程
同步:不具备开启新线程的能力
异步:具备开启线程的能力
并发和串行主要影响任务的执行方式
并发: 多个任务并发(同时)执行
串行:一个任务执行完毕,下一个任务才开始执行.
组合方式
异步 并发队列(最常用)
/** 异步(dispatch_async) 并发队列(全局队列)(最常用) 会创建线程,一次开多条, 并行的执行任务 */ - (void)createAsynGload{ //创建并发队列(全局队列) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadA"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadB"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadD"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadE"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadF"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadG"]; }); }
异步 串行队列(偶尔用)
/** 异步(dispatch_async) 串行队列(有时用) 会创建线程,一般开一条, 串行的执行任务 */ - (void)createAsynQueue{ //创建队列(串行队列,依次执行) dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadA"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadB"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadD"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadE"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadF"]; }); dispatch_async(queue, ^{ [self downLoad:@"http://ThreadG"]; }); }
异步 主队列(经常用)
/** 异步(dispatch_async) 主队列(很常用) 不会创建线程,在主线程中执行任务 */ - (void)createAsynMainQueue{ dispatch_queue_t mianQueue = dispatch_get_main_queue(); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadA"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadB"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadD"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadE"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadF"]; }); dispatch_async(mianQueue, ^{ [self downLoad:@"http://ThreadG"]; }); }
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题