GCD Queue 分为三种:
1,The main queue :主队列,主线程就是在个队列中。
2,Global queues : 全局并发队列。
3,用户队列:是用函数 dispatch_queue_create 创建的自定义队列
下面例子就是之前面试的试题:
sync 同步队列,dispatch_sync 函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。viewDidLoad 在主线程运行,
dispatch_sync 会把 块里面的内容放到一个线程里面,然后把线程加入到主线程中,
但是,sync的block(也就是“NSLog(@"=================5");”) 会等待主线程运行完成再调用,
然而主线程在等sync的block调用完成,
在互相等待中造成死锁
async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。上面例子就不会,
dispatch_get_global_queue, 在全局并发线程中加入,与主线程并发运行。
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"=================2");
});
上面这个block会等待主线程完成再执行,所以会阻塞异步的dispatch_get_global_queue一下下,等主线程完成了之后 运行NSLog(@"=================2");后返回,使dispatch_get_global_queue继续完成NSLog(@"=================3");
上图就是这个原理。
NSLog(@"=================2");的块会等待主线程完成再执行,所以会阻塞异步的dispatch_get_global_queue。
主线程一直完成不了,就会一直阻塞。
打印结果:
2014-11-30 17:56:22.296 Test[6108:379350] =================1
2014-11-30 17:56:22.296 Test[6108:379231] ==========阻塞主线程
永远等着。。。。。
网友评论