GCD (Grand Central Dispatch)
GCD 底层也是用线程来实现,指示苹果帮咱们封装了具体操作的方法,这样可以让程序员不用关注实现的细节,只需要专注功能的实现
GCD参数 queue:队列 block:任务
GCD 有两种执行任务的方式 1.同步 dispatch_sync(避免在主队列中使用同步执行主线程任务 容易死锁) 2,异步 dispatch_async
同步和异步的区别:
同步:在当前线程中执行
异步:在另一条线程中去执行
GCD执行多个任务的队列方式 也有两种:
1,串行队列:让任务一个接一个地执行(一个任务执行完再执行下一个任务)
2,并发队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效
串行队列又分成两种:
1,主队列 dispatch_get_main_queue() 主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放在主线程中执行
2,创建一个队列:dispatch_queue_create
死锁:在主队列(GCD)里面,在主线程(UI线程)同步执行任务 就会造成死锁
主队列 跟 主线程是一个东西
同步执行:一个任务执行完毕之后 才会去执行另一个任务
主队列(GCD)同步执行某个任务的时候,会等待前面的任务执行完毕之后再执行主队列里面的任务
但是 主队列 是在主线程里面执行任务的 《他们两个现在在同一个线程里面》,然而线程是顺序执行的,这时候主线程会等主队列里面的任务执行完毕之后,再去继续执行, 主队列会等待主线程执行完毕 才会去执行主队列里面的任务
同步执行
// 通过 GCD 获得 主队列
// 所有接受队列对象 都用 dispatch_queue_t
dispatch_queue_t mainqueue = dispatch_get_main_queue();
NSLog(@"主线程执行到这里等待主队列执行 ");
#pragma mark --------同步执行任务---------
dispatch_sync(mainqueue, ^{
NSLog(@"主队列 等待 主线程执行完毕之后 再执行");
});
NSLog(@"........");
输出结果:同步执行时,主队列一直在等待主线程执行完毕,但是主队列现在并不知道主线程和他现在处于同一个地方,所以他的等待没有尽头,永远等不到那个主线程
2016-04-27 16:20:29.192 多线程三GCD[4011:396363] 主线程执行到这里等待主队列执行
#pragma mark -------异步执行任务-----------
// 通过 GCD 获得 主队列
// 所有接受队列对象 都用 dispatch_queue_t
dispatch_queue_t mainqueue = dispatch_get_main_queue();
// 异步运行开辟一个线程,但是同步不运行开辟线程 (同步顺序执行,异步利用系统空闲时间去执行 ,程序员不能控制)
NSLog(@"主线程执行到这里 发现一个异步执行的代码 会执行异步执行的代码,但是没有等待里面的任务执行完毕之后再去继续执行主线程任务43333333");
dispatch_async(mainqueue, ^{
NSLog(@"小主没有等我执行完毕 ");
NSLog(@"更新UI %@",[NSThread currentThread]);
});
NSLog(@"没有等小异 可以继续走");
输出结果:
2016-04-27 16:49:47.019 多线程三GCD[4311:416832] 主线程执行到这里 发现一个异步执行的代码 会执行异步执行的代码,但是没有等待里面的任务执行完毕之后再去继续执行主线程任务43333333
2016-04-27 16:49:47.019 多线程三GCD[4311:416832] 没有等小异 可以继续走
2016-04-27 16:49:47.022 多线程三GCD[4311:416832] 小主没有等我执行完毕
2016-04-27 16:49:47.023 多线程三GCD[4311:416832] 更新UI {number = 1, name = main}
串行队列 有两种方式
1,主队列
2,创建队列
串行队列 是按照顺序 执行的
// dispatch_get_main_queue() 属于串行队列
// dispatch_queue_create("", NULL) 串行队列
// 串行队列:按照顺序去执行队列
dispatch_queue_t mainQueue1 = dispatch_get_main_queue();
dispatch_async(mainQueue1, ^{
NSLog(@"111111");
});
dispatch_async(mainQueue1, ^{
NSLog(@"222222");
});
dispatch_async(mainQueue1, ^{
NSLog(@"333333");
});
dispatch_async(mainQueue1, ^{
NSLog(@"444444");
});
2016-04-27 16:48:28.682 多线程三GCD[4245:414616] 111111
2016-04-27 16:48:28.683 多线程三GCD[4245:414616] 222222
2016-04-27 16:48:28.683 多线程三GCD[4245:414616] 33333
2016-04-27 16:48:28.683 多线程三GCD[4245:414616] 444444
创建队列:
#pragma mark ---------创建队列<串行队列>------------
dispatch_queue_t xiaoxiao = dispatch_queue_create("晓晓", NULL);
dispatch_sync(xiaoxiao, ^{
NSLog(@"1111111");
});
dispatch_sync(xiaoxiao, ^{
NSLog(@"2222222");
});
dispatch_sync(xiaoxiao, ^{
NSLog(@"3333333");
});
输出结果,同样是按顺序的
并发队列
可以设置队列任务的优先级
使用全局并发队列
// GCD 默认已经提供了全局的并发队列 供整个应用使用,不需要手动创建
// <#long identifier#> 指定优先级
dispatch_queue_t firstqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t twoqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t threequeue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(firstqueue, ^{
NSLog(@"1111111");
});
dispatch_async(twoqueue, ^{
NSLog(@"22222");
});
dispatch_async(threequeue, ^{
NSLog(@"333333");
});
输出结果:这里设置了 twoqueue最高优先级,treequeue低优先级,first queue 为默认优先级
2016-04-27 16:57:15.449 多线程三GCD[4582:425634] 22222
2016-04-27 16:57:15.449 多线程三GCD[4582:425633] 333333
2016-04-27 16:57:15.449 多线程三GCD[4582:425635] 1111111
// dispatch_group_create() 创建一个分组
// dispatch_group_t 就相当于 类名
dispatch_group_t num1 = dispatch_group_create();
dispatch_queue_t queue1 = dispatch_queue_create("num1",NULL);
// <#dispatch_group_t group#> 组名
// <#dispatch_queue_t queue#> 线程名
dispatch_group_async(num1, queue1, ^{
NSLog(@"download1.......");
});
dispatch_group_async(num1, queue1, ^{
NSLog(@"download2.......");
});
// 分组执行完毕
dispatch_group_notify(num1, queue1, ^{
NSLog(@"执行完毕1");
});
dispatch_group_t num2 = dispatch_group_create();
int nums=5 ;
for (int i = 0; i
输出结果:
2016-04-27 17:05:48.254 多线程三GCD[4786:433080] download1.......
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] download2.......
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 2download1.......
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 2download2.......
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 执行完毕1
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 执行完毕2