GCD 优势:
1. 可以用在多核并行运算
2. 自动利用更多的CPU内核
3. 自动管理线程的生命周期
任务:
GCD里的操作,分为同步执行(sync)和异步执行(async), 一般使用async,开辟了一个新线程执行任务
队列:
存放任务的队列,一种特殊的线性表,遵从FIFO原则,分为并行队列和串行队列
并行队列: Concurrent Dispatch Queue,让多个任务同时执行 ; 会自动开启多个线程能同时执行任务,只在异步执行才有效
串行队列: Serial Dispatch Queue,任务一个一个执行
GCD的使用: 创建任务,确定要做的事,将任务添加到队列;
在学习的过程中写了结果Demo,加深印象 :
//串行队列 + 同步任务
/**
不开线程
有序执行
*/
- (void)GCDDemo1{
/**
创建串行队列
参数1: 队列的标识符
参数2: 队列的属性,决定了队列是串行的还是并行的
DISPATCH_QUEUE_SERIAL: 串行队列
*/
dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_SERIAL);
for (NSInteger i = 0; i < 10; i ++) {
dispatch_sync(queue, ^{
NSLog(@"%zd %@",i, [NSThread currentThread]);
});
}
NSLog(@"串行队列要一个一个执行完之后,才会执行这一句");
}
//串行队列 + 异步任务
- (void)GCDDemo2{
dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_SERIAL);
for (NSInteger i = 0; i < 10; i ++) {
dispatch_async(queue, ^{
NSLog(@"%zd %@",i,[NSThread mainThread]);
});
}
NSLog(@"先执行这一句,在执行之上的异步任务");
}
//并行队列 + 同步任务
/**
不开线程
有序执行
*/
- (void)GCDDemo3{
//创建并行队列
//DISPATCH_QUEUE_CONCURRENT: 并行队列
//并行队列只能决定"是否"可以同时调度多个任务; 不能决定开不开线程
dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_CONCURRENT);
for (NSInteger i = 0; i < 10; i ++) {
dispatch_sync(queue, ^{
NSLog(@"%zd %@",i,[NSThread mainThread]);
});
}
NSLog(@"并行队列可以同时调度多个任务, 但是由于是同步任务,也只能是一个一个有序执行");
}
/**
并行队列 + 异步任务
*/
- (void)GCDDemo4{
//并行队列
dispatch_queue_t queue = dispatch_queue_create("GL", DISPATCH_QUEUE_CONCURRENT);
//异步任务
for (NSInteger i = 0; i < 10; i ++) {
dispatch_async(queue, ^{
NSLog(@"%zd %@",i,[NSThread mainThread]);
});
}
NSLog(@"并行队列 + 异步任务 导致 任务执行没有顺序");
}
/**
死锁
*/
- (void)GCDDemo5{
NSLog(@"1");
//这种写法直接导致死锁
/*
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
*/
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
最后一个死循环是在一篇博客上看到的, 作者解释的原因是任务3与任务2 在相互等待,所以造成死锁; 但是我直接写成:
/**
死循环
*/
- (void)GCDDemo5{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
}
这样子,也是死循环;
具体的原因我还不是很明白, 诸位若是能解惑,不胜感谢.
以上的Demo是学习这篇博客: 点击打开链接 .