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()
补充:
同步和异步:主要影响能不能开启新的线程
并发和串行主要影响任务的履行方式
组合方式
异步 并发队列(最经常使用)
/**
异步(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"];
});
}
下一篇 数据流中的中位数