国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > ios多线程 -- GCD介绍

ios多线程 -- GCD介绍

来源:程序员人生   发布时间:2016-07-13 08:55:45 阅读次数:2362次

GCD (纯C语言) 全称 Grand Central Dispatch,可译为“伟大的中枢调度器”

优点:
(1) GCD是为多核并行运算提出的解决方案
(2) GCD会自动利用更多的CPU内核(比如双核、4核)
(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 (⑵) // 低 * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台 */ dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

串行队列:让任务1个接1个履行,1个任务履行终了,才能履行下1个任务.

dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL); //dispatch_release(queue); // 非ARC需要释放手动创建的队列

串行队列的特殊情况:主队列:

dispatch_get_main_queue()

补充:
同步和异步:主要影响能不能开启新的线程

  • 同步:不具有开启新线程的能力
  • 异步:具有开启线程的能力

并发和串行主要影响任务的履行方式

  • 并发: 多个任务并发(同时)履行
  • 串行:1个任务履行终了,下1个任务才开始履行.

组合方式
异步 并发队列(最经常使用)

/** 异步(dispatch_async) 并发队列(全局队列)(最经常使用) 会创建线程,1次开多条, 并行的履行任务 */ - (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) 串行队列(有时用) 会创建线程,1般开1条, 串行的履行任务 */ - (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"]; }); }

异步主队列

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生