//在主线程执行
- (void)testGCD
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
});
NSLog(@"4");
while (1) {
}
NSLog(@"5");
}
问主线程执行testGCD
后控制台打印的结果是什么?
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
});
以上部分会异步将block
任务提交到一个全局并行队列中,该任务我们记为async_task
;同时主线程下面的代码可以称为main_task
:
NSLog(@"4");
while (1) {
}
NSLog(@"5");
可以知道async_task
和main_task
是并发执行的,因此执行结果可能有两种情况:先打印4后打印1或者相反(235下面讨论);
这时关注async_task
里的dispatch_sync
任务,我们记作sync_task
。
这个任务会同步提交到主队列等待执行,返回后才会打印3。
而在sync_task
前面串行等待的任务还有main_task
,也就是sync_task
要等待main_task
执行完才执行。
而这里的main_task
包含一个while(1){}
的死循环代码,因此永远执行不完,那么sync_task
就会一直等待,这就造成一个持续等待的局面。
简单点说就是,2被5卡住了,3被2卡住了。
因此不仅2无法打印,3和5也打印不出来。
所以最终结果是4, 1
或者1, 4
。
网友评论