__block NSInteger a = 0;
while (a < 5) {
//任务A
dispatch_async(dispatch_get_global_queue(0, 0), ^{
a ++;
NSLog(@"加加操作a=%li", (long)a);
});
}
//任务B
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"最后a=%li", (long)a);
});
这道题的打印结果是什么形式?
分析:
1.a=0进入while代码块,dispatch_async创建异步任务A放入并发队列中,dispatch_async是非阻塞的,再次进行while(a<5)的判断,此时a++的操作在异步线程中可能还没有执行,再次创建异步任务A放入并发队列中。
2.在a>=5时可能已经创建了几十上百个异步任务A等待执行中,while循环结束。最后将异步任务B放入并发队列中,此时任务B在并发队列的最后。
3.由于任务A中的代码很短,运行时间也很短,所以任务队列中的任务几乎是顺序执行的。由于任务B最后执行,所以任务B打印a的最终值。
任务A中如果是加入[NSThread sleepForTimeInterval:0.01]等耗时操作结果就不确定了。
网友评论