美文网首页
ios基础之一天一道笔试题(5)

ios基础之一天一道笔试题(5)

作者: 66be37b2096c | 来源:发表于2019-01-30 16:39 被阅读7次

    请写出程序执行后的输出结果:

    - (void)threadTest {
        NSLog(@"0");
        dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_sync(queue, ^{
            NSLog(@"1");
            dispatch_async(queue, ^{
                sleep(5);
                NSLog(@"2");
            });
            dispatch_async(queue, ^{
                sleep(1);
                NSLog(@"3");
            });
            NSLog(@"4");
        });
        NSLog(@"5");
    }
    

    结果:0,1,4,5,3,2
    解析:本题主要考察对队列、线程执行顺序、同步、异步的理解和掌握。
    首先,代码中创建的是并发队列,则表示CPU会在线程间快速切换,从而影响代码的输出结果,所以特意加了线程休眠操作以保证程序的输出固定,下面我们剖析执行过程:
    第一步输出0是毋庸置疑的,不做解释,
    第二步创建了一个并发队列,
    第三步同步执行代码,不会开启新的线程,会阻塞当前线程(主线程a),等待内部block里代码执行完才会结束,我们来到block内部继续分析代码执行:
    输出1也不做解释,
    继续执行,异步执行一段代码,此时会开启新的线程b来执行block内部的代码,不会阻塞线程,代码继续执行,同理异步开启一个新的线程c来执行block内部的代码,继续执行,输出4,至此,a线程里的block执行完毕,代码继续向下执行,输出5,
    a线程实行完毕,由于线程b和c有休眠操作,会进入休眠状态,待休眠结束,会继续执行,因为线程c的休眠时间短,故线程c先执行,假设线程b和c在同等条件下执行,则c线程会先于b线程结束执行,故输出顺序为3,2,
    由此我们最终得出顺序为:0,1,4,5,3,2
    结束语:此题可以有多种变形:如将并发队列改为串行队列,将同步改为异步,不同的组合会有不同的结果,有兴趣的可以自己尝试一下(有可能会出现死锁的情况哦,关于死锁的情况以后会单独解析)。

    相关文章

      网友评论

          本文标题:ios基础之一天一道笔试题(5)

          本文链接:https://www.haomeiwen.com/subject/kbjcsqtx.html