GCD全称是Grand Central Dispatch,可以译为“伟大的中央调度器”。它是纯C语言,提供了很多强大的函数。GCD是apple为多核的并行运算提出的解决方案。
任务与队列
任务:要执行的操作。
队列:存放任务的地方,队列在接收到任务后,队列回根据任务数与队列类型开辟合适的线程去执行任务。GCD就是担当把任务从队列中取出,放到对应线程中执行的角色。任务的取出遵循FIFO原则:先进先出,后进后出。
同步与异步
同步:只能在当前线程中执行任务,不具备开启新的线程的能力。
异步:可再新线程中执行任务,具备开启新线程的能力。
并发队列与串行队列
并发队列(Concurrent Dispatch Queue):可以开启多个线程同时执行多个任务。只有在异步函数(dispatch_async)下才有效。
串行队列(Seria Disp Queue):当一个任务执行完成,才能执行下一个任务。
不同任务加进不同队列的执行情况
①主队列是串行队列,那就只有一个主线程。
1、同步的任务加进这个线程,永远不会执行。当执行到此函数时,同步的函数要求立即执行block,而block被添加进队列的最后面,因为此线程从上往下执行任务,不可能调到线程最后取执行block,函数与线程冲突,造成程序死锁。
// 先获得主队列 主队列是一个串行队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 将任务加到任务中
// 第一个参数:放队列
// 第二个参数:要执行的任务
dispatch_sync(queue, ^{
NSLog(@"sync2--------%@", [NSThread currentThread]);
});
2、异步的任务加进主队列,因为只有一个线程,顾开辟不了线程,只能加进唯一的主线程。异步的方法中block不要求立即执行。
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"Asyc--------%@", [NSThread currentThread]);
});
②串行队列:遵循FIFO,按顺序执行。
1、同步:不开启新线程,直接执行任务就行。
// 创建串行队列
// 第一个参数:队列的名字
// 第二个参数:类型
dispatch_queue_t queue = dispatch_queue_create("aaa.com", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"sync + serial----1----%@", [NSThread currentThread]);
});
2、异步:开启新线程,串行执行任务
dispatch_queue_t queue = dispatch_queue_create("aaa.com", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"async + serial----1----%@", [NSThread currentThread]);
for (NSInteger i = 0; i < 1000; i++) {
NSLog(@"%ld", i);
}
});
③并发队列
1、同步:不开启新线程,串行执行任务。
// 此种是程序员自己创建的并发队列
// dispatch_queue_t queue = dispatch_queue_create("hello.com", DISPATCH_QUEUE_CONCURRENT);
// 获得全局的并发队列
// 第一个参数:一个优先级 默认的就行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
NSLog(@"sync + concurrent----1----%@", [NSThread currentThread]);
});
2、异步:开启新线程,并执行任务
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"async + concurrent----1----%@", [NSThread currentThread]);
});