GCD 线程学习笔记(1)

2016-04-22  本文已影响7人  Jin丶hy

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] ==========阻塞主线程

永远等着。。。。。

上一篇下一篇

猜你喜欢

热点阅读