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]);
});
}