1.gcd简介
- GCD是苹果公司为多核的并行运算提出的解决方案
- GCD会自动利用更多的CPU内核(比如双
- 全称是Grand Central Dispatch
- 纯C语言的,提供了非常多强大的函数
- 核、四核)
- GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
- 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
2.gcd 核心:将任务添加到队列
任务:执行什么操作(方法或者函数)
队列:存放任务的数据结构
使用步骤:
1.创建任务
2.将任务添加到队列中
3.队列的类型:
串行队列:特点 任务一个一个按照顺序执行(完成一个任务才能从队列中去下一个任务)
并发队列:特点 可以同时调度多个任务并发执行 并发功能只有在异步函数的情况下才有效果
- 同步的方式执行任务:在当前线程中依次执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
queue:队列
block:任务
- 异步的方式执行任务:新开线程,在新线程中执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
- 如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度新线程执行异步任务
4.模式组合
串行队列 同步执行:不开新线程,使用主线程,一个一个顺序执行
串行队列 异步执行:开一线程,一个一个顺序执行
并发队列 同步执行:不开线程,使用主线程,一个一个顺序执行
并发队列 异步执行:开多个线程,具体开多少个,和底层的线程池关系,并发无序执行
**从一下代码中可以总结出
//并发队列 同步执行
- (void)testGcd1
{
//创建队列
dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_CONCURRENT);
//创建任务
for(int i=0;i<10;i++)
{
dispatch_sync(queue, ^{
NSLog(@"%@ ----- %d",[NSThread currentThread],i);
});
}
}
//并发队列 异步执行
- (void)testGcd2
{
dispatch_queue_t queue = dispatch_queue_create("test2", DISPATCH_QUEUE_CONCURRENT);
for(int i=0;i<10;i++)
{
dispatch_async(queue, ^{
NSLog(@"%@ ----- %d",[NSThread currentThread],i);
});
}
}
//串行队列 同步执行
- (void)testGcd3
{
//创建队列
dispatch_queue_t queue = dispatch_queue_create("test3", DISPATCH_QUEUE_SERIAL);
//创建任务
for(int i=0;i<10;i++)
{
dispatch_sync(queue, ^{
NSLog(@"%@ ----- %d",[NSThread currentThread],i);
});
}
}
//串行队列 异步执行
- (void)testGcd4
{
dispatch_queue_t queue = dispatch_queue_create("test4", DISPATCH_QUEUE_SERIAL);
for(int i=0;i<10;i++)
{
dispatch_async(queue, ^{
NSLog(@"%@ ----- %d",[NSThread currentThread],i);
});
}
}
总结:开不开线程由同步和异步决定 ,开多少个线程由 串行和并发 来决定
串行队列只开1 个线程 并发队列开多个线程
5.系统默认提供了两个队列:
主队列:
主队列的特点:主队列中的任务只能在主县城空闲的时候才会被调度
又叫全局串行队列,程序启动默认为我门创建了主队列,在使用的时候不需要创建,
直接get.
dispatch_get_main_queue();
全局队列
特点:本质上还是并发队列,全局队列在mrc的情况下,不用release(只有一个)
dispatch_get_global_queue(0,0):第一个参数:iOS 8 服务质量 ios7 优先级
第二个参数,未来使用