请写出程序执行后的输出结果:
- (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
结束语:此题可以有多种变形:如将并发队列改为串行队列,将同步改为异步,不同的组合会有不同的结果,有兴趣的可以自己尝试一下(有可能会出现死锁的情况哦,关于死锁的情况以后会单独解析)。
网友评论