最近过年来打算换工作,因为搭档一直请假在家的原因没法进行交接,就临时替公司面试了二十来个人,发现过年来找工作的人好多呀,顿时觉得心里压力好大。我也在网上看了一些面试题和笔试题。想来总结一下这几天面试的心得。
一,在网上看面试题发现出题人对于面试者关于多线程的问题还是比较重视的。比如线程的任务和队列问题是比较多的。我们平时常用的是GCD,分为同步执行(sync)和异步执行(async)和队列组(dispatch_group)问题。
在队列组中,重点考察了队列组notify的使用,比如在多线程的异步执行中,当添加的任务都已经执行完毕以后,再回到主线程执行任务。
例如:
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务for(inti =0; i <2; ++i) { [NSThreadsleepForTimeInterval:2];// 模拟耗时操作NSLog(@"3---%@",[NSThreadcurrentThread]);
// 打印当前线程}NSLog(@"group---end"); });
还有一个线程信号的问题,dispatch_semaphore,通过控制计数的问题来控制线程的执行。
二,为了增加一点面试的难度,在网上找了几个坑用来面试的时候提问,
1.在GCD找了一个线程队列组组,在其中一个异步线程中还包含了一个异步线程,然后使用队列组notify,结果基本上全部面试者中了埋伏,都觉得是执行notify的时候,各个线程组里面的线程已经执行完毕,结果打印显示,先执行了各个队列线程组的第一个异步线程,然后走的最后的notify,最后才进了队列线程组里面的异步线程里面的异步线程。其实也算大家一起学习了。然后就想到了应该使用线程信号dispatch_semaphore问题来解决,当然使用NSOperationQueue能更好的解决这个问题。
2.封装了一个网络请求,在每次网络请求前我都加了一个SVP的菊花来增加显示效果,在每次请求成功或者失败以后通过SVP的提示消除菊花,然后在一个界面里面是有2个网络请求,我通过创建新线程在2个请求结束以后才能回到主线程更新UI界面,然后让面试者找问题。结果真是问题藏得比较深,只有3.4个人看出了问题。因为网络请求是在分线程中进行的,而网络封装里面因为加了菊花展示,所以就是在分线程中修改了UI,就会有报错提示。