【学习总结】【多线程】一些面试题

时间:2022-09-05 11:46:33

1. 多线程的底层实现?多线程的实现原理?多线程有什么作用?使用场合是什么?

一般问这个的话,比较空泛,分析一下,问题如没实际使用场景的话,可从问题原理上解释

1.1) 首先搞清楚什么是线程、什么是多线程、还可以适当带一下进程的概念。

Mach系统是第一个以多线程方式处理的任务~。(了解)

【学习总结】【多线程】 线程 & 进程 & NSThread(多线程的一套API)

1.2) 解释完基本名词,再告诉他实际开发中,应该怎么用,(着重讲GCD,或者你面试的项目中,使用到的多线程技术)

>  IOS开发中实现多线程的方案

l  C语言的POSIX接口:#include <pthread.h>

l  OC的NSThread

l  C语言的GCD接口(性能最好,代码更精简)(掌握)

l  OC的NSOperation和NSOperationQueue(基于GCD)

 

2. 多线程怎么通讯

多线程怎么通讯,以你面试的项目去说明怎么通讯,线程间通讯用得最多的场景就是,子线程下载资源,主线程拿到子线程下载的资源刷新UI

AFN网络通讯框架使用,SDWebImage缓存图片使用技巧

1.1) 线程间通讯通 反正就是,在子线程执行完之后,回到主线程干一些事情。

1> GCD

// 开启一个默认级别的优先级的 异步(async)线程,添加到主队列中

Dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0),^{
// 在这里的代码是子线程的代码,执行完之后在执行block的代码

Dispatch_async(dispatch_get_main_queue(),
^{

// 回到主线程
// Block执行完后执行 异步主线程dispatch_get_main : 主线程
// 在这里执行主线程的代码,回到主线程刷新UI
});

});

 

2 > performSelector: onThread: withObject: waitUntilDone:

// 开启一个默认级别的优先级的 异步(async)线程,添加到主队列中
Dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// Block执行完后执行 方法传递数据,子线程执行完毕
// 执行完这个线程的东西后,onThrea 跳回主线程 ,然后执行MyMethoe方法,并将withObject:image数据传递过去
[self performSelector:@selector(MyMethoe:) onThrea:([NSThread mainThread]), withObject:image waitUntilDone:YES modes:nil ];

});
// 这个方法是直接回到主线程
[self performSelectorOnMainThread: @selector(MyMethoe:) withObject:image waitUntilDone:YES ]

-(void) MyMethoe:(UIImage :)image{ }

 

3> NSMachPort (基于Mach操作系统的多线程)

// 无视了,不研究

 

 

3. 网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?

【学习总结】【多线程】一些面试题

SDWebImage框架就是帮忙解决这个问题的。(能扯到SDWebImage框架的使用)图片缓存,重复使用等。

 

4. 用NSOpertion和NSOpertionQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做?

依赖,例如:

// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

// 创建3个操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1
---“);
}];
NSOperation
*b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1
---“);
}];
NSOperation
*c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1
---“);
}];

// 添加依赖, 关键代码,创建依赖后,执行顺序变为C依赖 a,b 所以,ab执行完,C才会执行
[c addDependency:a];
[c addDependency:b];

// 执行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];

 

5. GCD内部怎么实现的

5.1) 作为了解吧。

1> iOSOS X的核心是XNU内核,GCD是基于XNU内核实现的

2> GCDAPI全部在libdispatch动态库中

3> GCD的底层实现主要有DispatchQueueDispatch Source

l  DispatchQueue :管理block(操作)

 

l  DispatchSource :处理事件(MACH端口发送,MACH端口接收,检测与进程相关事件等10种事件)

 

 

 

 

 

 

 

 

 

 

 

2>performSelector: onThread: withObject:waitUntilDone:

 

// 开启一个默认级别的优先级的  异步(async)线程,添加到主队列中

Dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

       //Block执行完后执行方法传递数据

      

       //执行完这个线程的东西后,onThrea 跳回主线程,然后执行MyMethoe方法,并将withObject:image数据传递过去

       [selfperformSelector:@selector(MyMethoe:) onThrea:([NSThread mainThread]),withObject:image waitUntilDone:YES modes:nil ];

      

});

       //这个方法是直接回到主线程

       [self  performSelectorOnMainThread: @selector(MyMethoe:)withObject:image waitUntilDone:YES ]

 

-(void) MyMethoe:(UIImage :)image{   }