基础知识:
下面是五道面试题,写出打印结果(题目从别人那盗的,但是作者写的看不明白,用自己语言总结一下)
第一题:
NSLog(@"1"); // 任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2"); // 任务2
});
NSLog(@"3"); // 任务3
分析:
a.任务2 和 任务3 谁先加入 主线程的?
==> 因为 任务3 本身是在主线程里面的,任务2通过dispatch_get_main_queue(),添加到主线程的,所以就是3在前,任务2在后
b.主线程是串行的,也就是先执行3,后执行任务2
c.但是dispatch_sync,就会让进入等待状态,也就是任务3无法现在执行,只有等着任务2执行完后,才执行,
步骤b,c 就相互等待,进入死锁了。
答案:1
第二题:
NSLog(@"1"); // 任务1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"2"); // 任务2
});
NSLog(@"3"); // 任务3
});
分析:任务3,没有加入dispatch_get_global_queue,前面有dispatch_sync,就等着任务2执行。
答案:123
第三题:
dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"1"); // 任务1
dispatch_async(queue,^{
NSLog(@"2");// 任务2
dispatch_sync(queue, ^{
NSLog(@"3"); // 任务3
});
NSLog(@"4"); // 任务4
});
NSLog(@"5"); // 任务5
分析: 任务5,不在dispatch_queue_create里面,前面是dispatch_async,可能5先执行,也可能任务2先执行。现在4已经在dispatch_queue_create里面了,但是前面又有dispatch_sync,等着3,3也需要加入dispatch_queue_create,3在4后面,和第一题一样,相互等待,死锁
答案:1 5 2 或 125
第四题:
NSLog(@"1"); // 任务1
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2"); // 任务2
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"3"); // 任务3
});
NSLog(@"4"); // 任务4
});
NSLog(@"5"); // 任务5
分析:任务2 和 任务5并行,不确定那个先后,但是肯定在 3,4 之前
答案:15234 或者12534
第五题:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1"); // 任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2"); // 任务2
});
NSLog(@"3"); // 任务3
});
NSLog(@"4"); // 任务4
while (1) {}
NSLog(@"5"); // 任务5
分析:任务1和任务4不一定那个先(两者并行),然后主线程死循环,主线程被阻塞,任务3加入全局队列,任务3前面有dispatch_sync,等着任务2 ,任务2加入了主线程,这时主线程已经死循环了,干不了事情,任务2挂了,任务3 也挂了,任务5早就挂了。