当同步和异步遇到主队列

主队列:只要队列中有任务,就会安排任务到主线程中执行。
但是如若主队列发现主线程在执行任务,那么主队列会暂停调度队列中的任务,直到主线程空闲为止。
同步函数:要求立马执行,我要是不执行,大家都别想执行。
所以当主线程中执行同步函数,并且这个同步函数的任务又是添加到了主队列时,主线程执行同步函数,主队列则等着把同步函数的第一个任务交给主线程执行,产生死锁。

#pragma mark- 同步 + 主线程 :死锁
-(void)syncMain {
    NSLog(@"----%@",[NSThread currentThread] );
    //1,获取并发队列,
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"start");
    //2,同步函数把任务添加到队列
    dispatch_sync(queue, ^{
        NSLog(@"download1---%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"download2---%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"download3---%@",[NSThread currentThread]);
    });
    NSLog(@"end");
}
Snip20170327_9.png
Snip20170327_11.png
#pragma mark- 异步 + 主线程:所有任务都在主线程中进行,不会开线程
-(void)asyncMain {
    NSLog(@"----%@",[NSThread currentThread] );
    //1,获取并发队列,
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"start");
    //2,异步函数把任务添加到队列
    dispatch_async(queue, ^{
        NSLog(@"download1---%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"download2---%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"download3---%@",[NSThread currentThread]);
    });
    NSLog(@"end");
}
Snip20170327_12.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,838评论 1 17
  • GCD GCD简介 Grand Central Dispatch中枢调度器 纯C语言的,提供了非常强大的函数 优势...
    彼岸的黑色曼陀罗阅读 476评论 0 0
  • 目录 一、基本概念1.多线程2.串行和并行, 并发3.队列与任务4.同步与异步5.线程状态6.多线程方案 二、GC...
    BohrIsLay阅读 1,623评论 5 12
  • 3.GCD GCD的全称是Grand Central Dispatch,提供了非常多的纯C语言的函数 GCD的优势...
    Mario_ZJ阅读 513评论 0 0
  • 一直对这句话深信不疑:离开别挽留,要走莫回头。 实际上真正懂得这句话的人,我们都不知道ta曾经经历过什么。 当你习...
    一只森女阅读 3,460评论 40 58